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(:)
222 logical :: is_malloced = .false.
224 integer(kind=i_kind) :: aero_rep_unique_id = 0
243 logical :: is_malloced = .false.
245 integer(kind=i_kind) :: aero_rep_unique_id = 0
265 result(update_data)
bind (c)
267 type(c_ptr) :: update_data
272 aero_rep_unique_id, section_id, gmd)
bind (c)
275 type(c_ptr),
value :: update_data
277 integer(kind=c_int),
value :: aero_rep_unique_id
280 integer(kind=c_int),
value :: section_id
282 real(kind=c_double),
value :: gmd
288 result(update_data)
bind (c)
290 type(c_ptr) :: update_data
295 aero_rep_unique_id, section_id, gsd)
bind (c)
298 type(c_ptr),
value :: update_data
300 integer(kind=c_int),
value :: aero_rep_unique_id
303 integer(kind=c_int),
value :: section_id
305 real(kind=c_double),
value :: gsd
312 type(c_ptr),
value,
intent(in) :: update_data
347 integer(kind=i_kind),
intent(in) :: spec_state_id
349 type(
property_t),
pointer :: sections, section, phases
350 integer(kind=i_kind) :: i_section, i_phase, j_phase, k_phase, &
352 integer(kind=i_kind) :: curr_spec_state_id
353 integer(kind=i_kind) :: num_phase, num_bin
354 integer(kind=i_kind) :: n_int_param, n_float_param
355 character(len=:),
allocatable :: key_name, phase_name, sect_type, str_val
356 real(kind=dp) :: min_dp, max_dp, d_log_dp
359 n_int_param = num_int_prop_
360 n_float_param = num_real_prop_
363 key_name =
"modes/bins"
365 this%property_set%get_property_t(key_name, sections), &
366 "Missing sections/bins for modal/binned mass aerosol "// &
367 "representation '"//this%rep_name//
"'")
368 call assert_msg(894962494, sections%size().gt.0,
"No sections or bins "// &
369 "specified for modal/binned mass aerosol representation '"// &
373 allocate(this%section_name(sections%size()))
378 call sections%iter_reset()
379 do i_section = 1, sections%size()
382 call assert(867378489, sections%get_key(key_name))
383 call assert_msg(234513113, len(key_name).gt.0,
"Missing mode/bin "// &
384 "name in modal/binned mass aerosol representation '"// &
386 this%section_name(i_section)%string = key_name
389 call assert_msg(517138327, sections%get_property_t(val=section), &
390 "Invalid structure for mode/bin '"// &
391 this%section_name(i_section)%string// &
392 "' in modal/binned mass aerosol representation '"// &
397 call assert_msg(742404898, section%get_string(key_name, sect_type), &
398 "Missing mode/bin type in mode/bin '"// &
399 this%section_name(i_section)%string// &
400 "' in modal/binned mass aerosol representation '"// &
403 sect_type.eq.
"MODAL".or.sect_type.eq.
"BINNED", &
404 "Invalid mode/bin type '"//sect_type//
"' in mode/bin '"// &
405 this%section_name(i_section)%string// &
406 "' in modal/binned mass aerosol representation '"// &
411 if (sect_type.eq.
"BINNED")
then
414 call assert_msg(824494286, section%get_int(key_name, num_bin), &
415 "Missing number of bins in bin '"// &
416 this%section_name(i_section)%string// &
417 "' in modal/binned mass aerosol representation '"// &
423 n_int_param = n_int_param + 5
427 n_float_param = n_float_param + 3*num_bin
431 call assert_msg(815518058, section%get_property_t(key_name, phases), &
432 "Missing phases for mode '"// &
433 this%section_name(i_section)%string// &
434 "' in modal/binned mass aerosol representation '"// &
438 call assert_msg(772593427, phases%size().gt.0, &
439 "No phases specified for mode '"// &
440 this%section_name(i_section)%string// &
441 "' in modal/binned mass aerosol representation '"// &
443 num_phase = num_phase + phases%size() * num_bin
446 call phases%iter_reset()
447 do i_phase = 1, phases%size()
450 call assert_msg(393427582, phases%get_string(val=phase_name), &
451 "Non-string phase name for mode '"// &
452 this%section_name(i_section)%string// &
453 "' in modal/binned mass aerosol representation '"// &
457 do j_phase = 1,
size(aero_phase_set)
458 if (phase_name.eq.aero_phase_set(j_phase)%val%name())
then
462 n_int_param = n_int_param + 3 * num_bin
465 n_float_param = n_float_param + 2 * num_bin
468 else if (j_phase.eq.
size(aero_phase_set))
then
469 call die_msg(652391420,
"Non-existant aerosol phase '"// &
470 phase_name//
"' specified for mode '"// &
471 this%section_name(i_section)%string// &
472 "' in modal/binned mass aerosol representation '"// &
477 call phases%iter_next()
480 call sections%iter_next()
484 allocate(this%aero_phase(num_phase))
485 allocate(this%aero_phase_is_at_surface(num_phase))
486 allocate(this%phase_state_id(
size(this%aero_phase)))
489 allocate(this%condensed_data_int(n_int_param))
490 allocate(this%condensed_data_real(n_float_param))
491 this%condensed_data_int(:) = int(0, kind=i_kind)
492 this%condensed_data_real(:) = real(0.0, kind=dp)
493 int_data_size_ = n_int_param
494 real_data_size_ = n_float_param
497 num_section_ = sections%size()
500 this%num_env_params = 2 * num_section_
506 n_int_param = num_int_prop_+2*num_section_+1
507 n_float_param = num_real_prop_+1
508 call sections%iter_reset()
509 do i_section = 1, num_section_
512 mode_int_prop_loc_(i_section) = n_int_param
513 mode_real_prop_loc_(i_section) = n_float_param
516 call assert(394743663, sections%get_property_t(val=section))
520 call assert(667058653, section%get_string(key_name, sect_type))
521 if (sect_type.eq.
"MODAL")
then
522 section_type_(i_section) = modal
523 else if (sect_type.eq.
"BINNED")
then
524 section_type_(i_section) = binned
526 call die_msg(256924433,
"Internal error")
530 num_bins_(i_section) = 1
531 if (section_type_(i_section).eq.binned)
then
533 call assert(315215287, section%get_int(key_name, num_bins_(i_section)))
537 if (section_type_(i_section).eq.modal)
then
541 effective_radius_(i_section,1) = -9999.9
542 number_conc_(i_section,1) = -9999.9
545 else if (section_type_(i_section).eq.binned)
then
548 key_name =
"minimum diameter [m]"
549 call assert_msg(548762180, section%get_real(key_name, min_dp), &
550 "Missing minimum diameter for bin '"// &
551 this%section_name(i_section)%string// &
552 "' in modal/binned mass aerosol representation '"// &
556 key_name =
"maximum diameter [m]"
557 call assert_msg(288632226, section%get_real(key_name, max_dp), &
558 "Missing maximum diameter for bin '"// &
559 this%section_name(i_section)%string// &
560 "' in modal/binned mass aerosol representation '"// &
565 call assert_msg(404761639, section%get_string(key_name, str_val), &
566 "Missing bin scale for bin '"// &
567 this%section_name(i_section)%string// &
568 "' in modal/binned mass aerosol representation '"// &
572 if (str_val.eq.
"LINEAR")
then
573 do i_bin = 1, num_bins_(i_section)
574 bin_dp_(i_section,i_bin) = min_dp + &
575 (i_bin-1) * (max_dp-min_dp)/(num_bins_(i_section)-1)
577 else if (str_val.eq.
"LOG")
then
578 d_log_dp = (log10(max_dp)-log10(min_dp))/(num_bins_(i_section)-1)
579 do i_bin = 1, num_bins_(i_section)
580 bin_dp_(i_section,i_bin) = 10.0d0**( log10(min_dp) + &
581 (i_bin-1) * d_log_dp )
584 call die_msg(236797392,
"Invalid scale specified for bin '"// &
585 this%section_name(i_section)%string// &
586 "' in modal/binned mass aerosol representation '"// &
589 do i_bin = 1, num_bins_(i_section)
591 effective_radius_(i_section,i_bin) = bin_dp_(i_section,i_bin) / 2.0
592 number_conc_(i_section,i_bin) = -9999.9
598 call assert(712411046, section%get_property_t(key_name, phases))
601 num_phase_(i_section) = phases%size()
604 n_int_param = n_int_param + 3
607 n_float_param = n_float_param + 3 * num_bins_(i_section)
610 call phases%iter_reset()
611 do j_phase = 1, phases%size()
614 call assert(775801035, phases%get_string(val=phase_name))
617 do k_phase = 1,
size(aero_phase_set)
618 if (phase_name.eq.aero_phase_set(k_phase)%val%name())
then
621 do i_bin = 1, num_bins_(i_section)
624 this%aero_phase(i_phase) = aero_phase_set(k_phase)
627 this%aero_phase_is_at_surface(i_phase) = .true.
630 this%phase_state_id(i_phase) = curr_spec_state_id
631 phase_state_id_(i_section, j_phase, i_bin) = curr_spec_state_id
634 curr_spec_state_id = curr_spec_state_id + &
635 aero_phase_set(k_phase)%val%size()
638 phase_model_data_id_(i_section, j_phase, i_bin) = k_phase
640 i_phase = i_phase + 1
645 n_int_param = n_int_param + 3*num_bins_(i_section)
648 n_float_param = n_float_param + 2*num_bins_(i_section)
651 else if (k_phase.eq.
size(aero_phase_set))
then
652 call die_msg(652391420,
"Internal error.")
656 call phases%iter_next()
659 call sections%iter_next()
666 call assert(951534966, i_phase-1.eq.num_phase)
667 call assert(951534966, n_int_param.eq.int_data_size_+1)
668 call assert(325387136, n_float_param.eq.real_data_size_+1)
683 character(len=*),
intent(in) :: section_name
685 integer(kind=i_kind),
intent(out) :: section_id
687 integer(kind=i_kind) :: i_section
689 call assert_msg(194186171, len(trim(section_name)).gt.0, &
690 "Trying to get section id of unnamed aerosol "// &
694 do i_section = 1,
size(this%section_name)
695 if (this%section_name(i_section)%string.eq.trim(section_name))
then
697 section_id = i_section
716 integer(kind=i_kind) :: state_size
720 integer(kind=i_kind) :: i_phase
724 do i_phase = 1,
size(this%aero_phase)
725 state_size = state_size + this%aero_phase(i_phase)%val%size()
750 character(len=*),
optional,
intent(in) :: phase_name
752 integer(kind=i_kind),
optional,
intent(in) :: tracer_type
754 character(len=*),
optional,
intent(in) ::
spec_name
756 logical,
optional,
intent(in) :: phase_is_at_surface
758 integer(kind=i_kind) :: num_spec, i_spec, j_spec, i_phase, j_phase, &
760 integer(kind=i_kind) :: curr_tracer_type
761 character(len=:),
allocatable :: curr_section_name, curr_phase_name, &
763 type(
string_t),
allocatable :: spec_names(:)
767 do i_phase = 1,
size(this%aero_phase)
770 if (
present(phase_name))
then
771 curr_phase_name = this%aero_phase(i_phase)%val%name()
772 if (phase_name.ne.curr_phase_name) cycle
776 if (
present(phase_is_at_surface))
then
777 if (phase_is_at_surface .neqv. &
778 this%aero_phase_is_at_surface(i_phase)) cycle
782 if (
present(
spec_name).or.
present(tracer_type))
then
783 spec_names = this%aero_phase(i_phase)%val%get_species_names()
784 do j_spec = 1,
size(spec_names)
786 this%aero_phase(i_phase)%val%get_species_type( &
787 spec_names(j_spec)%string)
789 if (
spec_name.ne.spec_names(j_spec)%string) cycle
791 if (
present(tracer_type))
then
792 if (tracer_type.ne.curr_tracer_type) cycle
794 num_spec = num_spec + 1
797 num_spec = num_spec + this%aero_phase(i_phase)%val%size()
808 do i_section = 1, num_section_
811 curr_section_name = this%section_name(i_section)%string
814 do j_phase = 1, num_phase_(i_section)
817 curr_phase_name = this%aero_phase(i_phase)%val%name()
820 if (
present(phase_name))
then
821 if (phase_name.ne.curr_phase_name)
then
822 i_phase = i_phase + num_bins_(i_section)
828 if (
present(phase_is_at_surface))
then
829 if (phase_is_at_surface .neqv. &
830 this%aero_phase_is_at_surface(i_phase))
then
831 i_phase = i_phase + num_bins_(i_section)
837 spec_names = this%aero_phase(i_phase)%val%get_species_names()
840 do i_bin = 1, num_bins_(i_section)
843 if (num_bins_(i_section).gt.1)
then
844 curr_bin_str = trim(
to_string(i_bin))//
"."
850 num_spec = this%aero_phase(i_phase)%val%size()
851 do j_spec = 1, num_spec
855 if (
spec_name.ne.spec_names(j_spec)%string) cycle
859 if (
present(tracer_type))
then
861 this%aero_phase(i_phase)%val%get_species_type( &
862 spec_names(j_spec)%string)
863 if (tracer_type.ne.curr_tracer_type) cycle
867 unique_names(i_spec)%string = curr_section_name//
"."// &
868 curr_bin_str//curr_phase_name//
'.'// &
869 spec_names(j_spec)%string
875 i_phase = i_phase + 1
879 deallocate(spec_names)
904 integer(kind=i_kind) :: spec_id
908 character(len=*),
intent(in) :: unique_name
911 integer(kind=i_kind) :: i_spec
917 spec_id = this%phase_state_id(1) + i_spec - 1
921 call die_msg( 105414960,
"Cannot find species '"//unique_name//
"'" )
931 character(len=:),
allocatable ::
spec_name
935 character(len=*),
intent(in) :: unique_name
938 integer(kind=i_kind) :: i_spec, j_spec, i_phase
941 type(
string_t),
allocatable :: spec_names(:)
949 do i_phase = 1,
size(this%aero_phase)
950 spec_names = this%aero_phase(i_phase)%val%get_species_names()
951 do j_spec = 1, this%aero_phase(i_phase)%val%size()
957 deallocate(spec_names)
974 character(len=*),
intent(in) :: phase_name
976 logical,
intent(in),
optional :: is_at_surface
978 integer(kind=i_kind) :: i_phase
981 if (
present(is_at_surface))
then
982 if (is_at_surface)
then
983 do i_phase = 1,
size(this%aero_phase)
984 if (this%aero_phase(i_phase)%val%name().eq.phase_name .and. &
985 this%aero_phase_is_at_surface(i_phase))
then
990 do i_phase = 1,
size(this%aero_phase)
991 if (this%aero_phase(i_phase)%val%name().eq.phase_name .and. &
992 .not. this%aero_phase_is_at_surface(i_phase))
then
993 call die_msg(507144607,
"Species must exist at surface "// &
994 "in modal/binned mass aerosol representation '"// &
1000 do i_phase = 1,
size(this%aero_phase)
1001 if (this%aero_phase(i_phase)%val%name().eq.phase_name)
then
1020 integer(kind=i_kind),
intent(in) :: phase_id
1022 integer(kind=i_kind) :: i_section, i_phase, i_bin, j_phase, &
1023 phase_id_to_find, section_size, &
1026 phase_id_to_find = phase_id
1028 do i_section = 1, num_section_
1029 section_size = num_phase_(i_section) * num_bins_(i_section)
1030 if( phase_id_to_find .le. section_size )
then
1031 i_phase = ( phase_id_to_find - 1 ) / num_bins_(i_section) + 1
1032 i_bin = mod( phase_id_to_find - 1, num_bins_(i_section) ) + 1
1034 do j_phase = section_start + i_bin - 1, &
1035 section_start + i_bin - 1 + &
1036 ( num_phase_(i_section) - 1 ) * num_bins_(i_section), &
1037 num_bins_(i_section)
1039 this%aero_phase( j_phase )%val%num_jac_elem( )
1043 phase_id_to_find = phase_id_to_find - section_size
1044 section_start = section_start + section_size
1055 phase_name_second)
result(index_pairs)
1059 character(len=*),
intent(in) :: phase_name_first
1061 character(len=*),
intent(in) :: phase_name_second
1064 allocate(index_pairs(0))
1074 integer(kind=i_kind) :: spec_id
1078 integer(kind=i_kind),
intent(in) :: phase_id
1080 character(len=*),
intent(in) ::
spec_name
1082 type(
string_t),
allocatable :: spec_names(:)
1083 integer(kind=i_kind) :: i_spec
1085 call assert_msg(237861905, phase_id .ge. 1 .and. phase_id .le.
size(this%phase_state_id), &
1086 "Phase id out of range")
1088 spec_names = this%aero_phase(phase_id)%val%get_species_names()
1090 do i_spec = 1,
size(spec_names)
1091 if (
spec_name .eq. spec_names(i_spec)%string)
then
1092 spec_id = this%phase_state_id(phase_id) + i_spec - 1
1096 deallocate(spec_names)
1098 if (spec_id .eq. 0)
then
1099 call die_msg(509274806,
"Cannot find species '"//trim(
spec_name)//
"' for phase id "// &
1113 if (
allocated(this%rep_name))
deallocate(this%rep_name)
1114 if (
allocated(this%aero_phase))
then
1116 call this%aero_phase(:)%dereference()
1117 deallocate(this%aero_phase)
1119 if (
associated(this%property_set)) &
1120 deallocate(this%property_set)
1121 if (
allocated(this%condensed_data_real)) &
1122 deallocate(this%condensed_data_real)
1123 if (
allocated(this%condensed_data_int)) &
1124 deallocate(this%condensed_data_int)
1136 integer(kind=i_kind) :: i_rep
1138 do i_rep = 1,
size(aero_reps)
1157 integer(kind=i_kind),
intent(in) :: aero_rep_type
1160 if (aero_rep_id_.eq.-1)
then
1164 update_data%aero_rep_unique_id = aero_rep_id_
1165 update_data%aero_rep_type = int(aero_rep_type, kind=c_int)
1167 update_data%is_malloced = .true.
1180 integer(kind=i_kind),
intent(in) :: section_id
1182 real(kind=dp),
intent(in) :: gmd
1185 this%aero_rep_unique_id, section_id-1, gmd)
1198 integer,
intent(in) :: comm
1214 character,
intent(inout) :: buffer(:)
1216 integer,
intent(inout) :: pos
1218 integer,
intent(in) :: comm
1221 integer :: prev_position
1227 pos - prev_position <= this%pack_size(comm))
1240 character,
intent(inout) :: buffer(:)
1242 integer,
intent(inout) :: pos
1244 integer,
intent(in) :: comm
1247 integer :: prev_position
1253 pos - prev_position <= this%pack_size(comm))
1280 integer(kind=i_kind) :: i_data
1282 do i_data = 1,
size(update_data)
1301 integer(kind=i_kind),
intent(in) :: aero_rep_type
1304 if (aero_rep_id_.eq.-1)
then
1308 update_data%aero_rep_unique_id = aero_rep_id_
1309 update_data%aero_rep_type = int(aero_rep_type, kind=c_int)
1311 update_data%is_malloced = .true.
1324 integer(kind=i_kind),
intent(in) :: section_id
1326 real(kind=dp),
intent(in) :: gsd
1329 this%aero_rep_unique_id, section_id-1, gsd)
1342 integer,
intent(in) :: comm
1358 character,
intent(inout) :: buffer(:)
1360 integer,
intent(inout) :: pos
1362 integer,
intent(in) :: comm
1365 integer :: prev_position
1371 pos - prev_position <= this%pack_size(comm))
1384 character,
intent(inout) :: buffer(:)
1386 integer,
intent(inout) :: pos
1388 integer,
intent(in) :: comm
1391 integer :: prev_position
1397 pos - prev_position <= this%pack_size(comm))
1424 integer(kind=i_kind) :: i_data
1426 do i_data = 1,
size(update_data)
Determine if specified phase(s) exist in adjacent layers. Returns array of phase_ids for adjacent pha...
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 the species id on the state array by phase_id and species 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.
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.