23 use iso_c_binding,
only: c_int, c_char, c_double, c_null_char, c_loc, c_ptr, &
44 bind(C, name="get_component_name")
48 integer(kind=c_int) :: bmi_status
50 character(len=*),
parameter :: component_name =
'MODFLOW 6'
52 name(1:len(component_name) + 1) = &
71 integer(kind=c_int) :: bmi_status
97 function bmi_update()
result(bmi_status)
bind(C, name="update")
100 integer(kind=c_int) :: bmi_status
102 logical :: hasconverged
119 integer(kind=c_int) :: bmi_status
135 bind(C, name="get_start_time")
138 real(kind=c_double),
intent(out) :: start_time
139 integer(kind=c_int) :: bmi_status
151 function get_end_time(end_time)
result(bmi_status)
bind(C, name="get_end_time")
156 real(kind=c_double),
intent(out) :: end_time
157 integer(kind=c_int) :: bmi_status
170 bind(C, name="get_current_time")
175 real(kind=c_double),
intent(out) :: current_time
176 integer(kind=c_int) :: bmi_status
189 bind(C, name="get_time_step")
194 real(kind=c_double),
intent(out) :: time_step
195 integer(kind=c_int) :: bmi_status
207 bind(C, name="get_input_item_count")
210 integer(kind=c_int),
intent(out) :: count
211 integer(kind=c_int) :: bmi_status
224 bind(C, name="get_output_item_count")
227 integer(kind=c_int),
intent(out) :: count
228 integer(kind=c_int) :: bmi_status
251 bind(C, name="get_input_var_names")
254 character(kind=c_char, len=1),
intent(inout) :: c_names(*)
255 integer(kind=c_int) :: bmi_status
257 integer(I4B) :: start, i
260 character(len=LENMEMADDRESS) :: var_address
264 do while (itr%has_next())
268 do i = 1, len(trim(var_address))
269 c_names(start + i - 1) = var_address(i:i)
271 c_names(start + i) = c_null_char
286 bind(C, name="get_output_var_names")
289 character(kind=c_char, len=1),
intent(inout) :: c_names(*)
290 integer(kind=c_int) :: bmi_status
292 integer(I4B) :: start, i
295 character(len=LENMEMADDRESS) :: var_address
299 do while (itr%has_next())
303 do i = 1, len(trim(var_address))
304 c_names(start + i - 1) = var_address(i:i)
306 c_names(start + i) = c_null_char
317 bind(C, name="get_var_itemsize")
320 character(kind=c_char),
intent(in) :: c_var_address(*)
321 integer(kind=c_int),
intent(out) :: var_size
322 integer(kind=c_int) :: bmi_status
324 character(len=LENMEMPATH) :: mem_path
325 character(len=LENVARNAME) :: var_name
326 logical(LGP) :: valid
331 if (.not. valid)
then
344 bind(C, name="get_var_nbytes")
347 character(kind=c_char),
intent(in) :: c_var_address(*)
348 integer(kind=c_int),
intent(out) :: var_nbytes
349 integer(kind=c_int) :: bmi_status
351 integer(I4B) :: var_size, isize
352 character(len=LENMEMPATH) :: mem_path
353 character(len=LENVARNAME) :: var_name
354 logical(LGP) :: valid
359 if (.not. valid)
then
366 call get_isize(var_name, mem_path, isize)
369 var_nbytes = var_size * isize
381 bind(C, name="get_value_double")
386 character(kind=c_char),
intent(in) :: c_var_address(*)
387 type(c_ptr),
intent(in) :: c_arr_ptr
388 integer(kind=c_int) :: bmi_status
390 character(len=LENMEMPATH) :: mem_path
391 character(len=LENVARNAME) :: var_name
392 logical(LGP) :: valid
394 real(dp),
pointer :: src_ptr, tgt_ptr
395 real(dp),
dimension(:),
pointer,
contiguous :: src1d_ptr, tgt1d_ptr
396 real(dp),
dimension(:, :),
pointer,
contiguous :: src2d_ptr, tgt2d_ptr
397 real(dp),
dimension(:, :, :),
pointer,
contiguous :: src3d_ptr, tgt3d_ptr
398 integer(I4B) :: i, j, k
403 if (.not. valid)
then
415 call c_f_pointer(c_arr_ptr, tgt_ptr)
417 else if (rank == 1)
then
418 call mem_setptr(src1d_ptr, var_name, mem_path)
419 call c_f_pointer(c_arr_ptr, tgt1d_ptr, shape(src1d_ptr))
420 do i = 1,
size(tgt1d_ptr)
421 tgt1d_ptr(i) = src1d_ptr(i)
423 else if (rank == 2)
then
424 call mem_setptr(src2d_ptr, var_name, mem_path)
425 call c_f_pointer(c_arr_ptr, tgt2d_ptr, shape(src2d_ptr))
426 do j = 1,
size(tgt2d_ptr, 2)
427 do i = 1,
size(tgt2d_ptr, 1)
428 tgt2d_ptr(i, j) = src2d_ptr(i, j)
431 else if (rank == 3)
then
432 call mem_setptr(src3d_ptr, var_name, mem_path)
433 call c_f_pointer(c_arr_ptr, tgt3d_ptr, shape(src3d_ptr))
434 do k = 1,
size(tgt3d_ptr, 3)
435 do j = 1,
size(tgt3d_ptr, 2)
436 do i = 1,
size(tgt3d_ptr, 1)
437 tgt3d_ptr(i, j, k) = src3d_ptr(i, j, k)
458 bind(C, name="get_value_int")
463 character(kind=c_char),
intent(in) :: c_var_address(*)
464 type(c_ptr),
intent(in) :: c_arr_ptr
465 integer(kind=c_int) :: bmi_status
467 character(len=LENMEMPATH) :: mem_path
468 character(len=LENVARNAME) :: var_name
469 logical(LGP) :: valid
471 integer(I4B),
pointer :: src_ptr, tgt_ptr
472 integer(I4B),
dimension(:),
pointer,
contiguous :: src1d_ptr, tgt1d_ptr
473 integer(I4B),
dimension(:, :),
pointer,
contiguous :: src2d_ptr, tgt2d_ptr
474 integer(I4B),
dimension(:, :, :),
pointer,
contiguous :: src3d_ptr, tgt3d_ptr
475 integer(I4B) :: i, j, k
480 if (.not. valid)
then
492 call c_f_pointer(c_arr_ptr, tgt_ptr)
494 else if (rank == 1)
then
495 call mem_setptr(src1d_ptr, var_name, mem_path)
496 call c_f_pointer(c_arr_ptr, tgt1d_ptr, shape(src1d_ptr))
497 do i = 1,
size(tgt1d_ptr)
498 tgt1d_ptr(i) = src1d_ptr(i)
500 else if (rank == 2)
then
501 call mem_setptr(src2d_ptr, var_name, mem_path)
502 call c_f_pointer(c_arr_ptr, tgt2d_ptr, shape(src2d_ptr))
503 do j = 1,
size(tgt2d_ptr, 2)
504 do i = 1,
size(tgt2d_ptr, 1)
505 tgt2d_ptr(i, j) = src2d_ptr(i, j)
508 else if (rank == 3)
then
509 call mem_setptr(src3d_ptr, var_name, mem_path)
510 call c_f_pointer(c_arr_ptr, tgt3d_ptr, shape(src3d_ptr))
511 do k = 1,
size(tgt3d_ptr, 3)
512 do j = 1,
size(tgt3d_ptr, 2)
513 do i = 1,
size(tgt3d_ptr, 1)
514 tgt3d_ptr(i, j, k) = src3d_ptr(i, j, k)
533 bind(C, name="get_value_bool")
538 character(kind=c_char),
intent(in) :: c_var_address(*)
539 type(c_ptr),
intent(in) :: c_arr_ptr
540 integer(kind=c_int) :: bmi_status
542 character(len=LENMEMPATH) :: mem_path
543 character(len=LENVARNAME) :: var_name
544 logical(LGP) :: valid
546 logical(LGP),
pointer :: src_ptr, tgt_ptr
551 if (.not. valid)
then
562 call c_f_pointer(c_arr_ptr, tgt_ptr)
581 bind(C, name="get_value_string")
585 character(kind=c_char),
intent(in) :: c_var_address(*)
586 type(c_ptr),
intent(in) :: c_arr_ptr
587 integer(kind=c_int) :: bmi_status
589 character(len=LENMEMPATH) :: mem_path
590 character(len=LENVARNAME) :: var_name
591 logical(LGP) :: valid
593 character(len=:),
pointer :: srcstr
594 character(kind=c_char),
pointer :: tgtstr(:)
596 character(kind=c_char),
pointer :: tgtstr1d(:, :)
597 character(:),
allocatable :: tempstr
598 integer(I4B) :: i, ilen, isize
603 if (.not. valid)
then
616 call c_f_pointer(c_arr_ptr, tgtstr, shape=[ilen + 1])
620 else if (rank == 1)
then
622 call mem_setptr(srccharstr1d, var_name, mem_path)
623 if (.not.
associated(srccharstr1d))
then
631 call get_isize(var_name, mem_path, isize)
633 call c_f_pointer(c_arr_ptr, tgtstr1d, shape=[ilen + 1, isize])
637 allocate (
character(ilen) :: tempstr)
639 tempstr = srccharstr1d(i)
659 function get_value(c_var_address, c_arr_ptr)
result(bmi_status) &
660 bind(C, name="get_value")
665 character(kind=c_char),
intent(in) :: c_var_address(*)
666 type(c_ptr),
intent(inout) :: c_arr_ptr
667 integer(kind=c_int) :: bmi_status
669 character(len=LENMEMPATH) :: mem_path
670 character(len=LENMEMTYPE) :: mem_type
671 character(len=LENVARNAME) :: var_name
672 logical(LGP) :: valid
677 if (.not. valid)
then
684 if (index(mem_type,
"DOUBLE") /= 0)
then
686 else if (index(mem_type,
"INTEGER") /= 0)
then
688 else if (index(mem_type,
"LOGICAL") /= 0)
then
690 else if (index(mem_type,
"STRING") /= 0)
then
709 bind(C, name="get_value_ptr")
714 character(kind=c_char),
intent(in) :: c_var_address(*)
715 type(c_ptr),
intent(inout) :: c_arr_ptr
716 integer(kind=c_int) :: bmi_status
718 character(len=LENMEMPATH) :: mem_path
719 character(len=LENMEMTYPE) :: mem_type
720 character(len=LENVARNAME) :: var_name
721 logical(LGP) :: valid
726 if (.not. valid)
then
733 if (index(mem_type,
"DOUBLE") /= 0)
then
735 else if (index(mem_type,
"INTEGER") /= 0)
then
737 else if (index(mem_type,
"LOGICAL") /= 0)
then
756 bind(C, name="get_value_ptr_double")
759 character(kind=c_char),
intent(in) :: c_var_address(*)
760 type(c_ptr),
intent(inout) :: c_arr_ptr
761 integer(kind=c_int) :: bmi_status
763 character(len=LENMEMPATH) :: mem_path
764 character(len=LENVARNAME) :: var_name
765 logical(LGP) :: valid
766 real(dp),
pointer :: scalar_ptr
767 real(dp),
dimension(:),
pointer,
contiguous :: array_ptr
768 real(dp),
dimension(:, :),
pointer,
contiguous :: array2d_ptr
769 real(dp),
dimension(:, :, :),
pointer,
contiguous :: array3d_ptr
775 if (.not. valid)
then
783 call mem_setptr(scalar_ptr, var_name, mem_path)
784 c_arr_ptr = c_loc(scalar_ptr)
785 else if (rank == 1)
then
786 call mem_setptr(array_ptr, var_name, mem_path)
787 c_arr_ptr = c_loc(array_ptr)
788 else if (rank == 2)
then
789 call mem_setptr(array2d_ptr, var_name, mem_path)
790 c_arr_ptr = c_loc(array2d_ptr)
791 else if (rank == 3)
then
792 call mem_setptr(array3d_ptr, var_name, mem_path)
793 c_arr_ptr = c_loc(array3d_ptr)
810 bind(C, name="get_value_ptr_int")
813 character(kind=c_char),
intent(in) :: c_var_address(*)
814 type(c_ptr),
intent(inout) :: c_arr_ptr
815 integer(kind=c_int) :: bmi_status
817 character(len=LENMEMPATH) :: mem_path
818 character(len=LENVARNAME) :: var_name
819 logical(LGP) :: valid
821 integer(I4B),
pointer :: scalar_ptr
822 integer(I4B),
dimension(:),
pointer,
contiguous :: array_ptr
823 integer(I4B),
dimension(:, :),
pointer,
contiguous :: array2d_ptr
824 integer(I4B),
dimension(:, :, :),
pointer,
contiguous :: array3d_ptr
829 if (.not. valid)
then
838 call mem_setptr(scalar_ptr, var_name, mem_path)
839 c_arr_ptr = c_loc(scalar_ptr)
840 else if (rank == 1)
then
841 call mem_setptr(array_ptr, var_name, mem_path)
842 c_arr_ptr = c_loc(array_ptr)
843 else if (rank == 2)
then
844 call mem_setptr(array2d_ptr, var_name, mem_path)
845 c_arr_ptr = c_loc(array2d_ptr)
846 else if (rank == 3)
then
847 call mem_setptr(array3d_ptr, var_name, mem_path)
848 c_arr_ptr = c_loc(array3d_ptr)
863 bind(C, name="get_value_ptr_bool")
866 character(kind=c_char),
intent(in) :: c_var_address(*)
867 type(c_ptr),
intent(inout) :: c_arr_ptr
868 integer(kind=c_int) :: bmi_status
870 character(len=LENMEMPATH) :: mem_path
871 character(len=LENVARNAME) :: var_name
872 logical(LGP) :: valid
873 logical(LGP),
pointer :: scalar_ptr
879 if (.not. valid)
then
887 call mem_setptr(scalar_ptr, var_name, mem_path)
888 c_arr_ptr = c_loc(scalar_ptr)
904 function set_value(c_var_address, c_arr_ptr)
result(bmi_status) &
905 bind(C, name="set_value")
910 character(kind=c_char),
intent(in) :: c_var_address(*)
911 type(c_ptr),
intent(inout) :: c_arr_ptr
912 integer(kind=c_int) :: bmi_status
914 character(len=LENMEMPATH) :: mem_path
915 character(len=LENMEMTYPE) :: mem_type
916 character(len=LENVARNAME) :: var_name
917 logical(LGP) :: valid
922 if (.not. valid)
then
929 if (index(mem_type,
"DOUBLE") /= 0)
then
931 else if (index(mem_type,
"INTEGER") /= 0)
then
933 else if (index(mem_type,
"LOGICAL") /= 0)
then
951 bind(C, name="set_value_double")
956 character(kind=c_char),
intent(in) :: c_var_address(*)
957 type(c_ptr),
intent(in) :: c_arr_ptr
958 integer(kind=c_int) :: bmi_status
960 character(len=LENMEMPATH) :: mem_path
961 character(len=LENVARNAME) :: var_name
962 logical(LGP) :: valid
964 real(dp),
pointer :: src_ptr, tgt_ptr
965 real(dp),
dimension(:),
pointer,
contiguous :: src1d_ptr, tgt1d_ptr
966 real(dp),
dimension(:, :),
pointer,
contiguous :: src2d_ptr, tgt2d_ptr
968 integer(I4B) :: status
973 if (.not. valid)
then
984 call c_f_pointer(c_arr_ptr, src_ptr)
986 else if (rank == 1)
then
987 call mem_setptr(tgt1d_ptr, var_name, mem_path)
988 call c_f_pointer(c_arr_ptr, src1d_ptr, shape(tgt1d_ptr))
989 do i = 1,
size(tgt1d_ptr)
990 tgt1d_ptr(i) = src1d_ptr(i)
992 else if (rank == 2)
then
993 call mem_setptr(tgt2d_ptr, var_name, mem_path)
994 call c_f_pointer(c_arr_ptr, src2d_ptr, shape(tgt2d_ptr))
995 do j = 1,
size(tgt2d_ptr, 2)
996 do i = 1,
size(tgt2d_ptr, 1)
997 tgt2d_ptr(i, j) = src2d_ptr(i, j)
1009 if (status /= 0)
then
1024 bind(C, name="set_value_int")
1029 character(kind=c_char),
intent(in) :: c_var_address(*)
1030 type(c_ptr),
intent(in) :: c_arr_ptr
1031 integer(kind=c_int) :: bmi_status
1033 character(len=LENMEMPATH) :: mem_path
1034 character(len=LENVARNAME) :: var_name
1035 logical(LGP) :: valid
1036 integer(I4B) :: rank
1037 integer(I4B),
pointer :: src_ptr, tgt_ptr
1038 integer(I4B),
dimension(:),
pointer,
contiguous :: src1d_ptr, tgt1d_ptr
1039 integer(I4B),
dimension(:, :),
pointer,
contiguous :: src2d_ptr, tgt2d_ptr
1040 integer(I4B) :: i, j
1041 integer(I4B) :: status
1045 call split_address(c_var_address, mem_path, var_name, valid)
1046 if (.not. valid)
then
1057 call c_f_pointer(c_arr_ptr, src_ptr)
1059 else if (rank == 1)
then
1060 call mem_setptr(tgt1d_ptr, var_name, mem_path)
1061 call c_f_pointer(c_arr_ptr, src1d_ptr, shape(tgt1d_ptr))
1062 do i = 1,
size(tgt1d_ptr)
1063 tgt1d_ptr(i) = src1d_ptr(i)
1065 else if (rank == 2)
then
1066 call mem_setptr(tgt2d_ptr, var_name, mem_path)
1067 call c_f_pointer(c_arr_ptr, src2d_ptr, shape(tgt2d_ptr))
1068 do j = 1,
size(tgt2d_ptr, 2)
1069 do i = 1,
size(tgt2d_ptr, 1)
1070 tgt2d_ptr(i, j) = src2d_ptr(i, j)
1082 if (status /= 0)
then
1097 bind(C, name="set_value_bool")
1102 character(kind=c_char),
intent(in) :: c_var_address(*)
1103 type(c_ptr),
intent(in) :: c_arr_ptr
1104 integer(kind=c_int) :: bmi_status
1106 character(len=LENMEMPATH) :: mem_path
1107 character(len=LENVARNAME) :: var_name
1108 logical(LGP) :: valid
1109 integer(I4B) :: rank
1110 logical(LGP),
pointer :: src_ptr, tgt_ptr
1111 integer(I4B) :: status
1115 call split_address(c_var_address, mem_path, var_name, valid)
1116 if (.not. valid)
then
1127 call c_f_pointer(c_arr_ptr, src_ptr)
1138 if (status /= 0)
then
1154 bind(C, name="get_var_type")
1159 character(kind=c_char),
intent(in) :: c_var_address(*)
1160 character(kind=c_char),
intent(out) :: c_var_type(
bmi_lenvartype)
1161 integer(kind=c_int) :: bmi_status
1163 character(len=LENMEMPATH) :: mem_path
1164 character(len=LENVARNAME) :: var_name
1165 character(len=LENMEMTYPE) :: mem_type
1166 logical(LGP) :: valid
1170 call split_address(c_var_address, mem_path, var_name, valid)
1171 if (.not. valid)
then
1177 c_var_type(1:len(trim(mem_type)) + 1) = &
1180 if (mem_type ==
'UNKNOWN')
then
1194 bind(C, name="get_var_rank")
1197 character(kind=c_char),
intent(in) :: c_var_address(*)
1198 integer(kind=c_int),
intent(out) :: c_var_rank
1199 integer(kind=c_int) :: bmi_status
1201 character(len=LENMEMPATH) :: mem_path
1202 character(len=LENVARNAME) :: var_name
1203 logical(LGP) :: valid
1207 call split_address(c_var_address, mem_path, var_name, valid)
1208 if (.not. valid)
then
1214 if (c_var_rank == -1)
then
1232 bind(C, name="get_var_shape")
1237 character(kind=c_char),
intent(in) :: c_var_address(*)
1238 integer(c_int),
intent(inout) :: c_var_shape(*)
1239 integer(kind=c_int) :: bmi_status
1241 integer(I4B),
dimension(MAXMEMRANK) :: var_shape
1242 integer(I4B) :: var_rank
1243 character(len=LENMEMPATH) :: mem_path
1244 character(len=LENVARNAME) :: var_name
1245 logical(LGP) :: valid
1249 call split_address(c_var_address, mem_path, var_name, valid)
1250 if (.not. valid)
then
1259 if (var_shape(1) == -1 .or. var_rank == -1)
then
1268 c_var_shape(1:var_rank) = var_shape(var_rank:1:-1)
This module contains simulation constants.
integer(i4b), parameter lenvarname
maximum length of a variable name
integer(i4b), parameter, public maxmemrank
maximum memory manager length (up to 3-dimensional arrays)
integer(i4b), parameter, public lenmemtype
maximum length of a memory manager type
integer(i4b), parameter lenmempath
maximum length of the memory path
This module defines variable data types.
character(len=lenmemaddress) function create_mem_address(mem_path, var_name)
returns the address string of the memory object
subroutine, public get_mem_type(name, mem_path, var_type)
@ brief Get the variable memory type
subroutine, public get_mem_shape(name, mem_path, mem_shape)
@ brief Get the variable memory shape
type(memorystoretype), public memorystore
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
subroutine, public get_mem_rank(name, mem_path, rank)
@ brief Get the variable rank
subroutine, public get_mem_elem_size(name, mem_path, size)
@ brief Get the memory size of a single element of the stored variable
subroutine, public on_memory_set(var_name, mem_path, status)
Triggers the calling of the side effect handler for this variable.
This module contains the MODFLOW 6 BMI.
integer(kind=c_int) function get_end_time(end_time)
Get the end time of the simulation.
integer(kind=c_int) function get_input_var_names(c_names)
Returns all input variables in the simulation.
integer(kind=c_int) function get_input_item_count(count)
Get the number of input variables in the simulation.
integer(kind=c_int) function get_value_ptr_double(c_var_address, c_arr_ptr)
Get a pointer to the array of double precision numbers.
integer(kind=c_int) function get_value_ptr_int(c_var_address, c_arr_ptr)
Get a pointer to the array of integer numbers.
integer(kind=c_int) function get_current_time(current_time)
Get the current time of the simulation.
integer(kind=c_int) function get_var_rank(c_var_address, c_var_rank)
Get the variable rank (non-BMI)
integer(kind=c_int) function get_output_item_count(count)
Get the number of output variables in the simulation.
integer(kind=c_int) function get_value_ptr_bool(c_var_address, c_arr_ptr)
Get a pointer to the logical scalar value.
integer(kind=c_int) function set_value(c_var_address, c_arr_ptr)
Set new values for a given variable.
integer(kind=c_int) function get_time_step(time_step)
Get the time step for the simulation.
integer(kind=c_int) function get_var_nbytes(c_var_address, var_nbytes)
Get size of the variable, in bytes.
integer(kind=c_int) function set_value_double(c_var_address, c_arr_ptr)
Set new values for a variable of type double.
integer(kind=c_int) function get_start_time(start_time)
Get the start time of the simulation.
integer(kind=c_int) function set_value_int(c_var_address, c_arr_ptr)
Set new values for a variable of type integer.
integer(kind=c_int) function get_var_itemsize(c_var_address, var_size)
Get the size (in bytes) of a single element of a variable.
integer(kind=c_int) function bmi_get_component_name(name)
integer(kind=c_int) function bmi_update()
Perform a computational time step.
integer(kind=c_int) function get_value_ptr(c_var_address, c_arr_ptr)
Get a pointer to an array.
integer(kind=c_int) function get_var_shape(c_var_address, c_var_shape)
Get the shape of the array for the variable (non-BMI)
integer(kind=c_int) function bmi_initialize()
Initialize the computational core.
integer(kind=c_int) function bmi_finalize()
Clean up the initialized simulation.
integer(kind=c_int) function get_value_int(c_var_address, c_arr_ptr)
Copy the integer values of a variable into the array.
integer(kind=c_int) function get_output_var_names(c_names)
Returns all output variables in the simulation.
integer(kind=c_int) function get_var_type(c_var_address, c_var_type)
Get the variable type as a string.
integer(kind=c_int) function get_value_double(c_var_address, c_arr_ptr)
Copy the double precision values of a variable into the array.
integer(kind=c_int) function set_value_bool(c_var_address, c_arr_ptr)
Set new value for a logical scalar variable.
integer(kind=c_int) function get_value(c_var_address, c_arr_ptr)
Copy the value of a variable into the array.
integer(kind=c_int) function get_value_string(c_var_address, c_arr_ptr)
Copy the string(s) of a variable into the array.
integer(kind=c_int) function get_value_bool(c_var_address, c_arr_ptr)
Copy the logical scalar value into the array.
integer(c_int), bind(C, name="ISTDOUTTOFILE") istdout_to_file
output control: =0 to screen, >0 to file
Detailed error information for the BMI.
character(len= *), parameter fmt_general_err
integer, parameter bmi_failure
BMI status code for failure (taken from bmi.f90, CSDMS)
character(len= *), parameter fmt_unsupported_type
character(len=lenerrmessage) bmi_last_error
module variable containing the last error as a Fortran string
subroutine report_bmi_error(err_msg)
Sets the last BMI error message and copies it to an exported C-string.
character(len= *), parameter fmt_invalid_mem_access
character(len= *), parameter fmt_unsupported_rank
integer, parameter bmi_success
BMI status code for success (taken from bmi.f90, CSDMS)
This module contains helper routines and parameters for the MODFLOW 6 BMI.
integer(c_int), bind(C, name="BMI_LENVARTYPE") bmi_lenvartype
max. length for variable type C-strings
integer(c_int), bind(C, name="BMI_LENCOMPONENTNAME") bmi_lencomponentname
component name length, i.e. 'MODFLOW 6'
subroutine split_address(c_var_address, mem_path, var_name, success)
Split the variable address string.
pure character(kind=c_char, len=1) function, dimension(length+1) string_to_char_array(string, length)
Convert Fortran string to C-style character string.
integer(c_int), bind(C, name="BMI_LENVARADDRESS") bmi_lenvaraddress
max. length for the variable's address C-string
logical(lgp) function mf6update()
Run a time step.
subroutine mf6initialize()
Initialize a simulation.
subroutine mf6finalize()
Finalize the simulation.
This module contains simulation variables.
integer(i4b) iforcestop
forced stop flag (1) forces a call to ustop(..) when the simulation has ended, (0) doesn't
character(len=linelength) simstdout
name of standard out file if screen output is piped to a file
integer(i4b) istdout
unit number for stdout
real(dp), pointer, public totim
time relative to start of simulation
real(dp), pointer, public totalsimtime
time at end of simulation
integer(i4b), pointer, public kstp
current time step number
integer(i4b), pointer, public kper
current stress period number
real(dp), pointer, public delt
length of the current time step
This class is used to store a single deferred-length character string. It was designed to work in an ...
An iterator used to iterate through a MemoryContainer.