92#define NUM_SECTION_ this%condensed_data_int(1)
93#define INT_DATA_SIZE_ this%condensed_data_int(2)
94#define REAL_DATA_SIZE_ this%condensed_data_int(3)
95#define AERO_REP_ID_ this%condensed_data_int(4)
96#define NUM_INT_PROP_ 4
97#define NUM_REAL_PROP_ 0
98#define NUM_ENV_PARAM_ 0
99#define MODE_INT_PROP_LOC_(x) this%condensed_data_int(NUM_INT_PROP_+x)
100#define MODE_REAL_PROP_LOC_(x) this%condensed_data_int(NUM_INT_PROP_+NUM_SECTION_+x)
101#define SECTION_TYPE_(x) this%condensed_data_int(MODE_INT_PROP_LOC_(x))
104#define NUM_BINS_(x) this%condensed_data_int(MODE_INT_PROP_LOC_(x)+1)
107#define NUM_PHASE_(x) this%condensed_data_int(MODE_INT_PROP_LOC_(x)+2)
110#define PHASE_STATE_ID_(x,y,b) this%condensed_data_int(MODE_INT_PROP_LOC_(x)+2+(b-1)*NUM_PHASE_(x)+y)
111#define PHASE_MODEL_DATA_ID_(x,y,b) this%condensed_data_int(MODE_INT_PROP_LOC_(x)+2+NUM_BINS_(x)*NUM_PHASE_(x)+(b-1)*NUM_PHASE_(x)+y)
114#define PHASE_NUM_JAC_ELEM_(x,y,b) this%condensed_data_int(MODE_INT_PROP_LOC_(x)+2+2*NUM_BINS_(x)*NUM_PHASE_(x)+(b-1)*NUM_PHASE_(x)+y)
117#define BIN_DP_(x,b) this%condensed_data_real(MODE_REAL_PROP_LOC_(x)+(b-1)*3)
120#define NUMBER_CONC_(x,b) this%condensed_data_real(MODE_REAL_PROP_LOC_(x)+(b-1)*3+1)
123#define EFFECTIVE_RADIUS_(x,b) this%condensed_data_real(MODE_REAL_PROP_LOC_(x)+(b-1)*3+2)
126#define PHASE_MASS_(x,y,b) this%condensed_data_real(MODE_REAL_PROP_LOC_(x)+3*NUM_BINS_(x)+(b-1)*NUM_PHASE_(x)+y-1)
129#define PHASE_AVG_MW_(x,y,b) this%condensed_data_real(MODE_REAL_PROP_LOC_(x)+(3+NUM_PHASE_(x))*NUM_BINS_(x)+(b-1)*NUM_PHASE_(x)+y-1)
146 integer(kind=i_kind),
allocatable :: phase_state_id(:)
220 logical :: is_malloced = .false.
222 integer(kind=i_kind) :: aero_rep_unique_id = 0
241 logical :: is_malloced = .false.
243 integer(kind=i_kind) :: aero_rep_unique_id = 0
263 result(update_data)
bind (c)
265 type(c_ptr) :: update_data
270 aero_rep_unique_id, section_id, gmd)
bind (c)
273 type(c_ptr),
value :: update_data
275 integer(kind=c_int),
value :: aero_rep_unique_id
278 integer(kind=c_int),
value :: section_id
280 real(kind=c_double),
value :: gmd
286 result(update_data)
bind (c)
288 type(c_ptr) :: update_data
293 aero_rep_unique_id, section_id, gsd)
bind (c)
296 type(c_ptr),
value :: update_data
298 integer(kind=c_int),
value :: aero_rep_unique_id
301 integer(kind=c_int),
value :: section_id
303 real(kind=c_double),
value :: gsd
310 type(c_ptr),
value,
intent(in) :: update_data
345 integer(kind=i_kind),
intent(in) :: spec_state_id
347 type(
property_t),
pointer :: sections, section, phases
348 integer(kind=i_kind) :: i_section, i_phase, j_phase, k_phase, &
350 integer(kind=i_kind) :: curr_spec_state_id
351 integer(kind=i_kind) :: num_phase, num_bin
352 integer(kind=i_kind) :: n_int_param, n_float_param
353 character(len=:),
allocatable :: key_name, phase_name, sect_type, str_val
354 real(kind=dp) :: min_dp, max_dp, d_log_dp
357 n_int_param = num_int_prop_
358 n_float_param = num_real_prop_
361 key_name =
"modes/bins"
363 this%property_set%get_property_t(key_name, sections), &
364 "Missing sections/bins for modal/binned mass aerosol "// &
365 "representation '"//this%rep_name//
"'")
366 call assert_msg(894962494, sections%size().gt.0,
"No sections or bins "// &
367 "specified for modal/binned mass aerosol representation '"// &
371 allocate(this%section_name(sections%size()))
376 call sections%iter_reset()
377 do i_section = 1, sections%size()
380 call assert(867378489, sections%get_key(key_name))
381 call assert_msg(234513113, len(key_name).gt.0,
"Missing mode/bin "// &
382 "name in modal/binned mass aerosol representation '"// &
384 this%section_name(i_section)%string = key_name
387 call assert_msg(517138327, sections%get_property_t(val=section), &
388 "Invalid structure for mode/bin '"// &
389 this%section_name(i_section)%string// &
390 "' in modal/binned mass aerosol representation '"// &
395 call assert_msg(742404898, section%get_string(key_name, sect_type), &
396 "Missing mode/bin type in mode/bin '"// &
397 this%section_name(i_section)%string// &
398 "' in modal/binned mass aerosol representation '"// &
401 sect_type.eq.
"MODAL".or.sect_type.eq.
"BINNED", &
402 "Invalid mode/bin type '"//sect_type//
"' in mode/bin '"// &
403 this%section_name(i_section)%string// &
404 "' in modal/binned mass aerosol representation '"// &
409 if (sect_type.eq.
"BINNED")
then
412 call assert_msg(824494286, section%get_int(key_name, num_bin), &
413 "Missing number of bins in bin '"// &
414 this%section_name(i_section)%string// &
415 "' in modal/binned mass aerosol representation '"// &
421 n_int_param = n_int_param + 5
425 n_float_param = n_float_param + 3*num_bin
429 call assert_msg(815518058, section%get_property_t(key_name, phases), &
430 "Missing phases for mode '"// &
431 this%section_name(i_section)%string// &
432 "' in modal/binned mass aerosol representation '"// &
436 call assert_msg(772593427, phases%size().gt.0, &
437 "No phases specified for mode '"// &
438 this%section_name(i_section)%string// &
439 "' in modal/binned mass aerosol representation '"// &
441 num_phase = num_phase + phases%size() * num_bin
444 call phases%iter_reset()
445 do i_phase = 1, phases%size()
448 call assert_msg(393427582, phases%get_string(val=phase_name), &
449 "Non-string phase name for mode '"// &
450 this%section_name(i_section)%string// &
451 "' in modal/binned mass aerosol representation '"// &
455 do j_phase = 1,
size(aero_phase_set)
456 if (phase_name.eq.aero_phase_set(j_phase)%val%name())
then
460 n_int_param = n_int_param + 3 * num_bin
463 n_float_param = n_float_param + 2 * num_bin
466 else if (j_phase.eq.
size(aero_phase_set))
then
467 call die_msg(652391420,
"Non-existant aerosol phase '"// &
468 phase_name//
"' specified for mode '"// &
469 this%section_name(i_section)%string// &
470 "' in modal/binned mass aerosol representation '"// &
475 call phases%iter_next()
478 call sections%iter_next()
482 allocate(this%aero_phase(num_phase))
483 allocate(this%aero_phase_is_at_surface(num_phase))
484 allocate(this%phase_state_id(
size(this%aero_phase)))
487 allocate(this%condensed_data_int(n_int_param))
488 allocate(this%condensed_data_real(n_float_param))
489 this%condensed_data_int(:) = int(0, kind=i_kind)
490 this%condensed_data_real(:) = real(0.0, kind=dp)
491 int_data_size_ = n_int_param
492 real_data_size_ = n_float_param
495 num_section_ = sections%size()
498 this%num_env_params = 2 * num_section_
504 n_int_param = num_int_prop_+2*num_section_+1
505 n_float_param = num_real_prop_+1
506 call sections%iter_reset()
507 do i_section = 1, num_section_
510 mode_int_prop_loc_(i_section) = n_int_param
511 mode_real_prop_loc_(i_section) = n_float_param
514 call assert(394743663, sections%get_property_t(val=section))
518 call assert(667058653, section%get_string(key_name, sect_type))
519 if (sect_type.eq.
"MODAL")
then
520 section_type_(i_section) = modal
521 else if (sect_type.eq.
"BINNED")
then
522 section_type_(i_section) = binned
524 call die_msg(256924433,
"Internal error")
528 num_bins_(i_section) = 1
529 if (section_type_(i_section).eq.binned)
then
531 call assert(315215287, section%get_int(key_name, num_bins_(i_section)))
535 if (section_type_(i_section).eq.modal)
then
539 effective_radius_(i_section,1) = -9999.9
540 number_conc_(i_section,1) = -9999.9
543 else if (section_type_(i_section).eq.binned)
then
546 key_name =
"minimum diameter [m]"
547 call assert_msg(548762180, section%get_real(key_name, min_dp), &
548 "Missing minimum diameter for bin '"// &
549 this%section_name(i_section)%string// &
550 "' in modal/binned mass aerosol representation '"// &
554 key_name =
"maximum diameter [m]"
555 call assert_msg(288632226, section%get_real(key_name, max_dp), &
556 "Missing maximum diameter for bin '"// &
557 this%section_name(i_section)%string// &
558 "' in modal/binned mass aerosol representation '"// &
563 call assert_msg(404761639, section%get_string(key_name, str_val), &
564 "Missing bin scale for bin '"// &
565 this%section_name(i_section)%string// &
566 "' in modal/binned mass aerosol representation '"// &
570 if (str_val.eq.
"LINEAR")
then
571 do i_bin = 1, num_bins_(i_section)
572 bin_dp_(i_section,i_bin) = min_dp + &
573 (i_bin-1) * (max_dp-min_dp)/(num_bins_(i_section)-1)
575 else if (str_val.eq.
"LOG")
then
576 d_log_dp = (log10(max_dp)-log10(min_dp))/(num_bins_(i_section)-1)
577 do i_bin = 1, num_bins_(i_section)
578 bin_dp_(i_section,i_bin) = 10.0d0**( log10(min_dp) + &
579 (i_bin-1) * d_log_dp )
582 call die_msg(236797392,
"Invalid scale specified for bin '"// &
583 this%section_name(i_section)%string// &
584 "' in modal/binned mass aerosol representation '"// &
587 do i_bin = 1, num_bins_(i_section)
589 effective_radius_(i_section,i_bin) = bin_dp_(i_section,i_bin) / 2.0
590 number_conc_(i_section,i_bin) = -9999.9
596 call assert(712411046, section%get_property_t(key_name, phases))
599 num_phase_(i_section) = phases%size()
602 n_int_param = n_int_param + 3
605 n_float_param = n_float_param + 3 * num_bins_(i_section)
608 call phases%iter_reset()
609 do j_phase = 1, phases%size()
612 call assert(775801035, phases%get_string(val=phase_name))
615 do k_phase = 1,
size(aero_phase_set)
616 if (phase_name.eq.aero_phase_set(k_phase)%val%name())
then
619 do i_bin = 1, num_bins_(i_section)
622 this%aero_phase(i_phase) = aero_phase_set(k_phase)
625 this%aero_phase_is_at_surface(i_phase) = .true.
628 this%phase_state_id(i_phase) = curr_spec_state_id
629 phase_state_id_(i_section, j_phase, i_bin) = curr_spec_state_id
632 curr_spec_state_id = curr_spec_state_id + &
633 aero_phase_set(k_phase)%val%size()
636 phase_model_data_id_(i_section, j_phase, i_bin) = k_phase
638 i_phase = i_phase + 1
643 n_int_param = n_int_param + 3*num_bins_(i_section)
646 n_float_param = n_float_param + 2*num_bins_(i_section)
649 else if (k_phase.eq.
size(aero_phase_set))
then
650 call die_msg(652391420,
"Internal error.")
654 call phases%iter_next()
657 call sections%iter_next()
664 call assert(951534966, i_phase-1.eq.num_phase)
665 call assert(951534966, n_int_param.eq.int_data_size_+1)
666 call assert(325387136, n_float_param.eq.real_data_size_+1)
681 character(len=*),
intent(in) :: section_name
683 integer(kind=i_kind),
intent(out) :: section_id
685 integer(kind=i_kind) :: i_section
687 call assert_msg(194186171, len(trim(section_name)).gt.0, &
688 "Trying to get section id of unnamed aerosol "// &
692 do i_section = 1,
size(this%section_name)
693 if (this%section_name(i_section)%string.eq.trim(section_name))
then
695 section_id = i_section
714 integer(kind=i_kind) :: state_size
718 integer(kind=i_kind) :: i_phase
722 do i_phase = 1,
size(this%aero_phase)
723 state_size = state_size + this%aero_phase(i_phase)%val%size()
748 character(len=*),
optional,
intent(in) :: phase_name
750 integer(kind=i_kind),
optional,
intent(in) :: tracer_type
752 character(len=*),
optional,
intent(in) ::
spec_name
754 logical,
optional,
intent(in) :: phase_is_at_surface
756 integer(kind=i_kind) :: num_spec, i_spec, j_spec, i_phase, j_phase, &
758 integer(kind=i_kind) :: curr_tracer_type
759 character(len=:),
allocatable :: curr_section_name, curr_phase_name, &
761 type(
string_t),
allocatable :: spec_names(:)
765 do i_phase = 1,
size(this%aero_phase)
768 if (
present(phase_name))
then
769 curr_phase_name = this%aero_phase(i_phase)%val%name()
770 if (phase_name.ne.curr_phase_name) cycle
774 if (
present(phase_is_at_surface))
then
775 if (phase_is_at_surface .neqv. &
776 this%aero_phase_is_at_surface(i_phase)) cycle
780 if (
present(
spec_name).or.
present(tracer_type))
then
781 spec_names = this%aero_phase(i_phase)%val%get_species_names()
782 do j_spec = 1,
size(spec_names)
784 this%aero_phase(i_phase)%val%get_species_type( &
785 spec_names(j_spec)%string)
787 if (
spec_name.ne.spec_names(j_spec)%string) cycle
789 if (
present(tracer_type))
then
790 if (tracer_type.ne.curr_tracer_type) cycle
792 num_spec = num_spec + 1
795 num_spec = num_spec + this%aero_phase(i_phase)%val%size()
806 do i_section = 1, num_section_
809 curr_section_name = this%section_name(i_section)%string
812 do j_phase = 1, num_phase_(i_section)
815 curr_phase_name = this%aero_phase(i_phase)%val%name()
818 if (
present(phase_name))
then
819 if (phase_name.ne.curr_phase_name)
then
820 i_phase = i_phase + num_bins_(i_section)
826 if (
present(phase_is_at_surface))
then
827 if (phase_is_at_surface .neqv. &
828 this%aero_phase_is_at_surface(i_phase))
then
829 i_phase = i_phase + num_bins_(i_section)
835 spec_names = this%aero_phase(i_phase)%val%get_species_names()
838 do i_bin = 1, num_bins_(i_section)
841 if (num_bins_(i_section).gt.1)
then
842 curr_bin_str = trim(
to_string(i_bin))//
"."
848 num_spec = this%aero_phase(i_phase)%val%size()
849 do j_spec = 1, num_spec
853 if (
spec_name.ne.spec_names(j_spec)%string) cycle
857 if (
present(tracer_type))
then
859 this%aero_phase(i_phase)%val%get_species_type( &
860 spec_names(j_spec)%string)
861 if (tracer_type.ne.curr_tracer_type) cycle
865 unique_names(i_spec)%string = curr_section_name//
"."// &
866 curr_bin_str//curr_phase_name//
'.'// &
867 spec_names(j_spec)%string
873 i_phase = i_phase + 1
877 deallocate(spec_names)
902 integer(kind=i_kind) :: spec_id
906 character(len=*),
intent(in) :: unique_name
909 integer(kind=i_kind) :: i_spec
915 spec_id = this%phase_state_id(1) + i_spec - 1
919 call die_msg( 105414960,
"Cannot find species '"//unique_name//
"'" )
929 character(len=:),
allocatable ::
spec_name
933 character(len=*),
intent(in) :: unique_name
936 integer(kind=i_kind) :: i_spec, j_spec, i_phase
939 type(
string_t),
allocatable :: spec_names(:)
947 do i_phase = 1,
size(this%aero_phase)
948 spec_names = this%aero_phase(i_phase)%val%get_species_names()
949 do j_spec = 1, this%aero_phase(i_phase)%val%size()
955 deallocate(spec_names)
972 character(len=*),
intent(in) :: phase_name
974 logical,
intent(in),
optional :: is_at_surface
976 integer(kind=i_kind) :: i_phase
979 if (
present(is_at_surface))
then
980 if (is_at_surface)
then
981 do i_phase = 1,
size(this%aero_phase)
982 if (this%aero_phase(i_phase)%val%name().eq.phase_name .and. &
983 this%aero_phase_is_at_surface(i_phase))
then
988 do i_phase = 1,
size(this%aero_phase)
989 if (this%aero_phase(i_phase)%val%name().eq.phase_name .and. &
990 .not. this%aero_phase_is_at_surface(i_phase))
then
991 call die_msg(507144607,
"Species must exist at surface "// &
992 "in modal/binned mass aerosol representation '"// &
998 do i_phase = 1,
size(this%aero_phase)
999 if (this%aero_phase(i_phase)%val%name().eq.phase_name)
then
1018 integer(kind=i_kind),
intent(in) :: phase_id
1020 integer(kind=i_kind) :: i_section, i_phase, i_bin, j_phase, &
1021 phase_id_to_find, section_size, &
1024 phase_id_to_find = phase_id
1026 do i_section = 1, num_section_
1027 section_size = num_phase_(i_section) * num_bins_(i_section)
1028 if( phase_id_to_find .le. section_size )
then
1029 i_phase = ( phase_id_to_find - 1 ) / num_bins_(i_section) + 1
1030 i_bin = mod( phase_id_to_find - 1, num_bins_(i_section) ) + 1
1032 do j_phase = section_start + i_bin - 1, &
1033 section_start + i_bin - 1 + &
1034 ( num_phase_(i_section) - 1 ) * num_bins_(i_section), &
1035 num_bins_(i_section)
1037 this%aero_phase( j_phase )%val%num_jac_elem( )
1041 phase_id_to_find = phase_id_to_find - section_size
1042 section_start = section_start + section_size
1053 phase_name_second)
result(index_pairs)
1057 character(len=*),
intent(in) :: phase_name_first
1059 character(len=*),
intent(in) :: phase_name_second
1062 allocate(index_pairs(0))
1074 if (
allocated(this%rep_name))
deallocate(this%rep_name)
1075 if (
allocated(this%aero_phase))
then
1077 call this%aero_phase(:)%dereference()
1078 deallocate(this%aero_phase)
1080 if (
associated(this%property_set)) &
1081 deallocate(this%property_set)
1082 if (
allocated(this%condensed_data_real)) &
1083 deallocate(this%condensed_data_real)
1084 if (
allocated(this%condensed_data_int)) &
1085 deallocate(this%condensed_data_int)
1097 integer(kind=i_kind) :: i_rep
1099 do i_rep = 1,
size(aero_reps)
1118 integer(kind=i_kind),
intent(in) :: aero_rep_type
1121 if (aero_rep_id_.eq.-1)
then
1125 update_data%aero_rep_unique_id = aero_rep_id_
1126 update_data%aero_rep_type = int(aero_rep_type, kind=c_int)
1128 update_data%is_malloced = .true.
1141 integer(kind=i_kind),
intent(in) :: section_id
1143 real(kind=dp),
intent(in) :: gmd
1146 this%aero_rep_unique_id, section_id-1, gmd)
1159 integer,
intent(in) :: comm
1175 character,
intent(inout) :: buffer(:)
1177 integer,
intent(inout) :: pos
1179 integer,
intent(in) :: comm
1182 integer :: prev_position
1188 pos - prev_position <= this%pack_size(comm))
1201 character,
intent(inout) :: buffer(:)
1203 integer,
intent(inout) :: pos
1205 integer,
intent(in) :: comm
1208 integer :: prev_position
1214 pos - prev_position <= this%pack_size(comm))
1241 integer(kind=i_kind) :: i_data
1243 do i_data = 1,
size(update_data)
1262 integer(kind=i_kind),
intent(in) :: aero_rep_type
1265 if (aero_rep_id_.eq.-1)
then
1269 update_data%aero_rep_unique_id = aero_rep_id_
1270 update_data%aero_rep_type = int(aero_rep_type, kind=c_int)
1272 update_data%is_malloced = .true.
1285 integer(kind=i_kind),
intent(in) :: section_id
1287 real(kind=dp),
intent(in) :: gsd
1290 this%aero_rep_unique_id, section_id-1, gsd)
1303 integer,
intent(in) :: comm
1319 character,
intent(inout) :: buffer(:)
1321 integer,
intent(inout) :: pos
1323 integer,
intent(in) :: comm
1326 integer :: prev_position
1332 pos - prev_position <= this%pack_size(comm))
1345 character,
intent(inout) :: buffer(:)
1347 integer,
intent(inout) :: pos
1349 integer,
intent(in) :: comm
1352 integer :: prev_position
1358 pos - prev_position <= this%pack_size(comm))
1385 integer(kind=i_kind) :: i_data
1387 do i_data = 1,
size(update_data)
Get the size of the section of the camp_camp_state::camp_state_t::state_var array required for this a...
Initialize the aerosol representation data, validating component data and loading any required inform...
Extending-type binary pack function (Internal use only)
Extending-type binary unpack function (Internal use only)
Extending-type binary pack size (internal use only)
Get the number of Jacobian elements used in calculations of aerosol mass, volume, number,...
Get the number of instances of a specified aerosol phase.
Get the non-unique name of a chemical species by its unique name.
Get a species id on the camp_camp_state::camp_state_t::state_var array by unique name....
Get a list of unique names for each element on the camp_camp_state::camp_state_t::state_var array for...
Free an update data object.
Interface to c aerosol representation functions.
Allocate space for a GSD update object.
Interface for to_string functions.
The abstract aero_phase_data_t structure and associated subroutines.
subroutine finalize_array(this)
Finalize the aerosol phase data.
type(aero_phase_data_t) function, pointer constructor(phase_name, init_size)
Constructor for aero_phase_data_t.
subroutine finalize(this)
Finalize the aerosol phase data.
integer(kind=i_kind) function pack_size(this, comm)
Determine the size of a binary required to pack the aerosol representation data.
The abstract aero_rep_data_t structure and associated subroutines.
The abstract aero_rep_modal_binned_mass_t structure and associated subroutines.
subroutine update_data_init_gsd(this, update_data, aero_rep_type)
Initialize a GSD update data object.
subroutine internal_bin_unpack_gsd(this, buffer, pos, comm)
Unpack the given value from the buffer, advancing position.
logical function get_section_id(this, section_name, section_id)
Get an id for a mode or bin by name for use with updates from external modules.
subroutine internal_bin_pack_gmd(this, buffer, pos, comm)
Pack the given value to the buffer, advancing position.
subroutine update_data_gmd_finalize_array(update_data)
Finalize a GMD update data array.
type(index_pair_t) function, dimension(:), allocatable adjacent_phases(this, phase_name_first, phase_name_second)
Determine is specified phase(s) exist in adjacent layers. Returns array of phase_ids for adjacent pha...
subroutine internal_bin_unpack_gmd(this, buffer, pos, comm)
Unpack the given value from the buffer, advancing position.
subroutine internal_bin_pack_gsd(this, buffer, pos, comm)
Pack the given value to the buffer, advancing position.
subroutine update_data_set_gsd(this, section_id, GSD)
Set packed update data for mode GSD.
integer(kind=i_kind) function internal_pack_size_gmd(this, comm)
Determine the size of a binary required to pack the reaction data.
subroutine update_data_set_gmd(this, section_id, GMD)
Set packed update data for mode GMD.
integer(kind=i_kind) function internal_pack_size_gsd(this, comm)
Determine the size of a binary required to pack the reaction data.
integer(kind=i_kind), parameter, public update_gsd
subroutine update_data_gsd_finalize(this)
Finalize a GSD update data object.
subroutine update_data_gsd_finalize_array(update_data)
Finalize a GSD update data array.
subroutine update_data_gmd_finalize(this)
Finalize a GMD update data object.
integer(kind=i_kind), parameter, public update_gmd
subroutine update_data_init_gmd(this, update_data, aero_rep_type)
Initialize a GMD update object.
The camp_state_t structure and associated subroutines.
The chem_spec_data_t structure and associated subroutines.
Wrapper functions for MPI.
subroutine camp_mpi_pack_logical(buffer, position, val, comm)
Packs the given value into the buffer, advancing position.
subroutine camp_mpi_unpack_integer(buffer, position, val, comm)
Unpacks the given value from the buffer, advancing position.
subroutine camp_mpi_unpack_logical(buffer, position, val, comm)
Unpacks the given value from the buffer, advancing position.
integer function camp_mpi_pack_size_logical(val, comm)
Determines the number of bytes required to pack the given value.
subroutine camp_mpi_pack_integer(buffer, position, val, comm)
Packs the given value into the buffer, advancing position.
integer function camp_mpi_pack_size_integer(val, comm)
Determines the number of bytes required to pack the given value.
The property_t structure and associated subroutines.
Random number generators.
integer(kind=i_kind) function generate_int_id()
Generate an integer id Ids will be sequential, and can only be generated by the primary process.
Common utility subroutines.
subroutine assert(code, condition_ok)
Errors unless condition_ok is true.
subroutine die_msg(code, error_msg)
Error immediately.
subroutine assert_msg(code, condition_ok, error_msg)
Errors unless condition_ok is true.
Pointer type for building arrays.
Abstract aerosol representation data type.
Define index_pair array for adjacent_phases functions.
Modal mass aerosol representation.
String type for building arrays of string of various size.