8 use fckit_configuration_module,
only: fckit_configuration
9 use fckit_log_module,
only: fckit_log
14 use kinds,
only: kind_real
15 use oops_variables_mod,
only: oops_variables
16 use string_utils,
only: swap_name_member
17 use unstructured_interpolation_mod
20 use interpolatorbump_mod,
only: bump_interpolator
23 use ufo_vars_mod,
only: maxvarlen, ufo_vars_getindex
25 use ufo_geovals_mod,
only: ufo_geovals
28 use atm_core,
only: atm_simulation_clock_init, atm_compute_output_diagnostics
30 use mpas_derived_types
31 use mpas_kind_types,
only: strkind
32 use mpas_pool_routines
33 use mpas_stream_manager
64 type (mpas_streammanager_type),
pointer,
public :: manager
65 type (mpas_clock_type),
pointer,
public :: clock
67 character(len=MAXVARLEN),
allocatable,
public :: fldnames(:)
68 type (mpas_pool_type),
pointer,
public :: subfields => null()
69 integer,
public :: nf_ci
70 character(len=MAXVARLEN),
allocatable,
public :: fldnames_ci(:)
103 generic,
public :: get => &
117 generic,
public :: copy_to => &
129 generic,
public :: copy_to_ad => &
141 generic,
public :: copy_from => &
153 generic,
public :: push_back => &
183 [ character(len=maxvarlen) :: &
184 "qc",
"qi",
"qr",
"qs",
"qg",
"qh" ]
186 [ character(len=maxvarlen) :: &
187 "re_cloud",
"re_ice ",
"re_snow " ]
189 [character(len=maxvarlen) :: &
190 'uReconstructZonal',
'uReconstructMeridional']
192 [character(len=maxvarlen) :: &
195 [character(len=maxvarlen) :: &
196 'surface_pressure',
'temperature']
198 [character(len=maxvarlen) :: &
199 'qv',
'pressure',
'rho',
'theta']
205 #define LISTED_TYPE mpas_fields
208 #include <oops/util/linkedList_i.f>
220 #include <oops/util/linkedList_c.f>
229 type(
mpas_geom),
intent(in),
pointer :: geom
230 type(oops_variables),
intent(in) :: vars, vars_ci
232 integer :: ivar, ierr
234 self % nf = vars % nvars()
235 allocate(self % fldnames(self % nf))
236 do ivar = 1, self % nf
237 self % fldnames(ivar) = trim(vars % variable(ivar))
240 self % nf_ci = vars_ci % nvars()
241 allocate(self % fldnames_ci(self % nf_ci))
242 do ivar = 1, self % nf_ci
243 self % fldnames_ci(ivar) = trim(vars_ci % variable(ivar))
246 write(
message,*)
"DEBUG: create_fields: self % fldnames(:) =",self % fldnames(:)
250 if (
associated(geom))
then
253 call abor1_ftn(
"--> create_fields: geom not associated")
257 allocate(self % clock)
258 call atm_simulation_clock_init(self % clock, self % geom % domain % blocklist % configs, ierr)
259 if ( ierr .ne. 0 )
then
260 call abor1_ftn(
"--> create_fields: atm_simulation_clock_init problem")
276 call da_template_pool(self % geom, self % subFields, self % nf, self % fldnames)
288 if (
allocated(self % fldnames))
deallocate(self % fldnames)
289 if (
allocated(self % fldnames_ci))
deallocate(self % fldnames_ci)
291 call fckit_log%debug(
'--> delete_fields: deallocate subFields Pool')
294 call mpas_destroy_clock(self % clock, ierr)
295 if ( ierr .ne. 0 )
then
296 call fckit_log%info (
'--> delete_fields deallocate clock failed')
298 call fckit_log%debug(
'--> delete_fields done')
309 type(mpas_pool_type),
pointer,
intent(inout) :: pool
311 if (
associated(pool))
then
312 call mpas_pool_destroy_pool(pool)
324 type (mpas_time_type) :: rhs_time
327 call fckit_log%debug(
'--> copy_fields: copy subFields Pool')
330 if (
allocated(self % fldnames))
deallocate(self % fldnames)
331 allocate(self % fldnames(self % nf))
332 self % fldnames(:) = rhs % fldnames(:)
334 self % nf_ci = rhs % nf_ci
335 if (
allocated(self % fldnames_ci))
deallocate(self % fldnames_ci)
336 allocate(self % fldnames_ci(self % nf_ci))
337 self % fldnames_ci(:) = rhs % fldnames_ci(:)
339 rhs_time = mpas_get_clock_time(rhs % clock, mpas_now, ierr)
340 call mpas_set_clock_time(self % clock, rhs_time, mpas_now)
342 call copy_pool(rhs % subFields, self % subFields)
344 call fckit_log%debug(
'--> copy_fields done')
353 type(mpas_pool_type),
pointer,
intent(in) :: pool_src
354 type(mpas_pool_type),
pointer,
intent(inout) :: pool
359 call mpas_pool_create_pool(pool)
360 call mpas_pool_clone_pool(pool_src, pool)
370 type(fckit_configuration),
intent(in) :: f_conf
371 type(datetime),
intent(inout) :: vdate
372 character(len=:),
allocatable :: str
373 character(len=20) :: sdate
374 type (MPAS_Time_type) :: local_time
375 character (len=StrKIND) :: dateTimeString, streamID, time_string, filename, temp_filename
376 integer :: ierr = 0, ngrid
377 type (mpas_pool_type),
pointer :: state, diag, mesh
378 type (field2DReal),
pointer :: pressure, pressure_base, pressure_p
380 call fckit_log%debug(
'--> read_fields')
381 call f_conf%get_or_die(
"date",str)
383 call datetime_set(sdate, vdate)
385 call f_conf%get_or_die(
"filename",str)
386 call swap_name_member(f_conf, str)
388 write(
message,*)
'--> read_fields: Reading ',trim(temp_filename)
400 self % manager => self % geom % domain % streamManager
401 datetimestring =
'$Y-$M-$D_$h:$m:$s'
403 write(
message,*)
'--> read_fields: dateTimeString: ',trim(datetimestring)
405 call mpas_set_time(local_time, datetimestring=datetimestring, ierr=ierr)
406 call mpas_set_clock_time(self % clock, local_time, mpas_now)
407 call mpas_set_clock_time(self % geom % domain % clock, local_time, mpas_start_time)
408 call mpas_expand_string(datetimestring, -1, temp_filename, filename)
409 call mpas_stream_mgr_set_property(self % manager, streamid, mpas_stream_property_filename, filename)
410 write(
message,*)
'--> read_fields: Reading ',trim(filename)
412 call mpas_stream_mgr_read(self % manager, streamid=streamid, &
413 & when=datetimestring, rightnow=.true., ierr=ierr)
414 if ( ierr .ne. 0 )
then
415 write(
message,*)
'--> read_fields: MPAS_stream_mgr_read failed ierr=',ierr
421 if (f_conf%has(
"no_transf"))
then
422 call f_conf%get_or_die(
"no_transf",ierr)
430 call mpas_pool_get_subpool(self % geom % domain % blocklist % structs,
'diag', diag)
431 call mpas_pool_get_field(diag,
'pressure_p', pressure_p)
432 call mpas_pool_get_field(diag,
'pressure_base', pressure_base)
433 call mpas_pool_get_field(diag,
'pressure', pressure)
434 ngrid = self % geom % nCellsSolve
435 pressure%array(:,1:ngrid) = pressure_base%array(:,1:ngrid) + pressure_p%array(:,1:ngrid)
446 type (domain_type),
pointer,
intent(inout) :: domain
447 type (mpas_pool_type),
pointer,
intent(inout) :: subfields
448 integer,
intent(in) :: ngrid
449 type (field2dreal),
pointer :: theta, pressure, temperature, specific_humidity
450 type (field3dreal),
pointer :: scalars
451 type (mpas_pool_type),
pointer :: state
452 integer,
pointer :: index_qv
464 call mpas_pool_get_field(domain % blocklist % allFields,
'theta', theta)
465 call mpas_pool_get_field(domain % blocklist % allFields,
'pressure', pressure)
466 call mpas_pool_get_field(subfields,
'temperature', temperature)
467 call mpas_pool_get_field(domain % blocklist % allFields,
'scalars', scalars)
468 call mpas_pool_get_field(subfields,
'spechum', specific_humidity)
470 call mpas_pool_get_subpool(domain % blocklist % structs,
'state',state)
471 call mpas_pool_get_dimension(state,
'index_qv', index_qv)
473 call theta_to_temp(theta % array(:,1:ngrid), pressure % array(:,1:ngrid), temperature % array(:,1:ngrid))
474 call w_to_q( scalars % array(index_qv,:,1:ngrid) , specific_humidity % array(:,1:ngrid) )
484 type(fckit_configuration),
intent(in) :: f_conf
485 type(datetime),
intent(in) :: vdate
486 character(len=:),
allocatable :: str
487 character(len=20) :: validitydate
489 type (MPAS_Time_type) :: fld_time, write_time
490 character (len=StrKIND) :: dateTimeString, dateTimeString2, streamID, time_string, filename, temp_filename
494 call datetime_to_string(vdate, validitydate)
495 write(
message,*)
'--> write_fields: ',trim(validitydate)
497 call f_conf%get_or_die(
"filename",str)
498 call swap_name_member(f_conf, str)
500 write(
message,*)
'--> write_fields: ',trim(temp_filename)
506 datetimestring =
'$Y-$M-$D_$h:$m:$s'
509 call mpas_set_time(write_time, datetimestring=datetimestring, ierr=ierr)
510 fld_time = mpas_get_clock_time(self % clock, mpas_now, ierr)
511 call mpas_get_time(fld_time, datetimestring=datetimestring2, ierr=ierr)
512 write(
message,*)
'check time --> write_fields: write_time,fld_time: ',trim(datetimestring),trim(datetimestring2)
514 call mpas_expand_string(datetimestring, -1, trim(temp_filename), filename)
516 self % manager => self % geom % domain % streamManager
522 call mpas_stream_mgr_set_property(self % manager, streamid, mpas_stream_property_filename, filename)
524 write(
message,*)
'--> write_fields: writing ',trim(filename)
526 call mpas_stream_mgr_write(self % geom % domain % streamManager, streamid=streamid, &
527 forcewritenow=.true., writetime=datetimestring, ierr=ierr)
528 if ( ierr .ne. 0 )
then
529 write(
message,*)
'--> write_fields: MPAS_stream_mgr_write failed ierr=',ierr
543 if (self%geom%nCells == rhs%geom%nCells .and. self%geom%nVertLevels == rhs%geom%nVertLevels)
then
545 else if (self%geom%nVertLevels == rhs%geom%nVertLevels)
then
548 write(
message,*)
'--> change_resol_fields: ',self%geom%nCells, rhs%geom%nCells, self%geom%nVertLevels, rhs%geom%nVertLevels
550 call abor1_ftn(
"mpas_fields_mod:change_resol_fields: VertLevels dimension mismatch")
584 call da_random(self % subFields, fld_select = self % fldnames_ci)
594 integer,
intent(in) :: nf
595 real(kind=kind_real),
intent(out) :: pstat(3, nf)
597 call da_gpnorm(self % subFields, self % geom % domain % dminfo, nf, pstat, fld_select = self % fldnames_ci(1:nf))
607 real(kind=kind_real),
intent(out) :: prms
609 call da_fldrms(self % subFields, self % geom % domain % dminfo, prms, fld_select = self % fldnames_ci)
620 character(len=StrKIND) :: kind_op
623 call da_operator(trim(kind_op), self % subFields, rhs % subFields, fld_select = self % fldnames_ci)
634 character(len=StrKIND) :: kind_op
637 call da_operator(trim(kind_op), self % subFields, rhs % subFields, fld_select = self % fldnames_ci)
648 character(len=StrKIND) :: kind_op
651 call da_operator(trim(kind_op), self % subFields, rhs % subFields, fld_select = self % fldnames_ci)
661 real(kind=kind_real),
intent(in) :: zz
673 real(kind=kind_real),
intent(in) :: zz
676 call da_axpy(self % subFields, rhs % subFields, zz, fld_select = self % fldnames_ci)
686 real(kind=kind_real),
intent(inout) :: zprod
688 call da_dot_product(self % subFields, fld % subFields, self % geom % domain % dminfo, zprod)
707 type(bump_interpolator) :: bumpinterp
708 type(unstrc_interp) :: unsinterp
709 type (mpas_pool_iterator_type) :: poolItr
710 real(kind=kind_real),
allocatable :: interp_in(:,:), interp_out(:,:)
711 real (kind=kind_real),
dimension(:),
pointer :: r1d_ptr
712 real (kind=kind_real),
dimension(:,:),
pointer :: r2d_ptr
713 integer,
dimension(:),
pointer :: i1d_ptr
714 integer,
dimension(:,:),
pointer :: i2d_ptr
715 integer :: rhs_nCells, self_nCells, maxlevels, nlevels, jlev
716 logical :: use_bump_interp
717 integer,
allocatable :: rhsDims(:)
719 use_bump_interp = rhs%geom%use_bump_interpolation
721 if (use_bump_interp)
then
729 maxlevels = rhs%geom%nVertLevelsP1
730 rhs_ncells = rhs%geom%nCellsSolve
731 self_ncells = self%geom%nCellsSolve
733 allocate(interp_in(rhs_ncells, maxlevels))
734 allocate(interp_out(self_ncells, maxlevels))
736 call mpas_pool_begin_iteration(rhs%subFields)
737 do while ( mpas_pool_get_next_member(rhs%subFields, poolitr) )
738 if (poolitr % memberType == mpas_pool_field)
then
739 write(
message,*)
'poolItr % nDims , poolItr % memberName =', poolitr % nDims , trim(poolitr % memberName)
744 if (poolitr % nDims == 1)
then
746 if (poolitr % dataType == mpas_pool_integer)
then
747 call mpas_pool_get_array(rhs%subFields, trim(poolitr % memberName), i1d_ptr)
748 interp_in(:,1) = real( i1d_ptr(1:rhs_ncells), kind_real)
749 else if (poolitr % dataType == mpas_pool_real)
then
750 call mpas_pool_get_array(rhs%subFields, trim(poolitr % memberName), r1d_ptr)
751 interp_in(:,1) = r1d_ptr(1:rhs_ncells)
753 else if (poolitr % nDims == 2)
then
756 if (nlevels > maxlevels)
then
757 write(
message,*)
'--> interpolate_fields: nlevels > maxlevels, ', nlevels, maxlevels
760 if (poolitr % dataType == mpas_pool_integer)
then
761 call mpas_pool_get_array(rhs%subFields, trim(poolitr % memberName), i2d_ptr)
762 interp_in(1:rhs_ncells,1:nlevels) = real( transpose(i2d_ptr(1:nlevels,1:rhs_ncells)), kind_real )
763 else if (poolitr % dataType == mpas_pool_real)
then
764 call mpas_pool_get_array(rhs%subFields, trim(poolitr % memberName), r2d_ptr)
765 interp_in(1:rhs_ncells,1:nlevels) = transpose(r2d_ptr(1:nlevels,1:rhs_ncells))
768 write(
message,*)
'--> interpolate_fields: poolItr % nDims == ',poolitr % nDims,
' not handled'
772 if (use_bump_interp)
then
773 call bumpinterp%apply(interp_in(:,1:nlevels), &
774 interp_out(:,1:nlevels), &
778 call unsinterp%apply(interp_in(:,jlev),interp_out(:,jlev))
783 if (poolitr % nDims == 1)
then
784 if (poolitr % dataType == mpas_pool_integer)
then
785 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i1d_ptr)
786 i1d_ptr(1:self_ncells) = int(interp_out(:,1))
787 else if (poolitr % dataType == mpas_pool_real)
then
788 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r1d_ptr)
789 r1d_ptr(1:self_ncells) = interp_out(:,1)
791 else if (poolitr % nDims == 2)
then
792 if (poolitr % dataType == mpas_pool_integer)
then
793 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i2d_ptr)
794 i2d_ptr(1:nlevels,1:self_ncells) = transpose(int(interp_out(1:self_ncells,1:nlevels)))
795 else if (poolitr % dataType == mpas_pool_real)
then
796 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r2d_ptr)
797 r2d_ptr(1:nlevels,1:self_ncells) = transpose(interp_out(1:self_ncells,1:nlevels))
802 deallocate(interp_in)
803 deallocate(interp_out)
804 if (
allocated(rhsdims))
deallocate(rhsdims)
820 class(
mpas_geom),
intent(in) :: geom_from
821 type(bump_interpolator),
intent(inout) :: bumpinterp
823 real(kind=kind_real),
allocatable :: lats_to(:), lons_to(:)
825 allocate( lats_to(geom_to%nCellsSolve) )
826 allocate( lons_to(geom_to%nCellsSolve) )
830 call bumpinterp%init(geom_from%f_comm,afunctionspace_in=geom_from%afunctionspace,lon_out=lons_to,lat_out=lats_to, &
831 & nl=geom_from%nVertLevels)
851 class(
mpas_geom),
intent(in) :: geom_from
852 type(unstrc_interp),
intent(inout) :: unsinterp
854 integer :: nn, ngrid_from, ngrid_to
855 character(len=8) :: wtype =
'barycent'
856 real(kind=kind_real),
allocatable :: lats_from(:), lons_from(:), lats_to(:), lons_to(:)
860 ngrid_from = geom_from%nCellsSolve
861 ngrid_to = geom_to%nCellsSolve
865 allocate( lats_from(ngrid_from) )
866 allocate( lons_from(ngrid_from) )
869 allocate( lats_to(ngrid_to) )
870 allocate( lons_to(ngrid_to) )
877 call unsinterp%create(geom_from%f_comm, nn, wtype, &
878 ngrid_from, lats_from, lons_from, &
879 ngrid_to, lats_to, lons_to)
883 deallocate(lats_from)
884 deallocate(lons_from)
896 integer(c_size_t),
intent(out) :: vsize
899 type (mpas_pool_iterator_type) :: poolItr
900 integer,
allocatable :: dimSizes(:)
905 call mpas_pool_begin_iteration(self%subFields)
906 do while ( mpas_pool_get_next_member(self%subFields, poolitr) )
907 if (poolitr % memberType == mpas_pool_field)
then
909 vsize = vsize + product(dimsizes)
924 integer(c_size_t),
intent(in) :: vsize
925 real(kind_real),
intent(out) :: vect_inc(vsize)
928 integer :: index, nvert, nhoriz, vv, hh
929 type (mpas_pool_iterator_type) :: poolItr
930 integer,
allocatable :: dimSizes(:)
932 real (kind=kind_real),
dimension(:),
pointer :: r1d_ptr_a
933 real (kind=kind_real),
dimension(:,:),
pointer :: r2d_ptr_a
934 integer,
dimension(:),
pointer :: i1d_ptr_a
935 integer,
dimension(:,:),
pointer :: i2d_ptr_a
940 call mpas_pool_begin_iteration(self%subFields)
941 do while ( mpas_pool_get_next_member(self%subFields, poolitr) )
942 if (poolitr % memberType == mpas_pool_field)
then
944 if (poolitr % nDims == 1)
then
946 if (poolitr % dataType == mpas_pool_integer)
then
947 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i1d_ptr_a)
949 vect_inc(index + 1) = real(i1d_ptr_a(hh), kind=kind_real)
952 else if (poolitr % dataType == mpas_pool_real)
then
953 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r1d_ptr_a)
955 vect_inc(index + 1) = r1d_ptr_a(hh)
959 elseif (poolitr % nDims == 2)
then
962 if (poolitr % dataType == mpas_pool_integer)
then
963 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i2d_ptr_a)
966 vect_inc(index + 1) = real(i2d_ptr_a(vv, hh), kind=kind_real)
970 else if (poolitr % dataType == mpas_pool_real)
then
971 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r2d_ptr_a)
974 vect_inc(index + 1) = r2d_ptr_a(vv, hh)
980 write(
message,*)
'--> serialize_fields: poolItr % nDims == ',poolitr % nDims,
' not handled'
997 integer(c_size_t),
intent(in) :: vsize
998 real(kind_real),
intent(in) :: vect_inc(vsize)
999 integer(c_size_t),
intent(inout) :: index
1002 integer :: nvert, nhoriz, vv, hh
1003 type (mpas_pool_iterator_type) :: poolItr
1004 integer,
allocatable :: dimSizes(:)
1006 real (kind=kind_real),
dimension(:),
pointer :: r1d_ptr_a
1007 real (kind=kind_real),
dimension(:,:),
pointer :: r2d_ptr_a
1008 integer,
dimension(:),
pointer :: i1d_ptr_a
1009 integer,
dimension(:,:),
pointer :: i2d_ptr_a
1011 call mpas_pool_begin_iteration(self%subFields)
1012 do while ( mpas_pool_get_next_member(self%subFields, poolitr) )
1013 if (poolitr % memberType == mpas_pool_field)
then
1015 if (poolitr % nDims == 1)
then
1016 nhoriz = dimsizes(1)
1017 if (poolitr % dataType == mpas_pool_integer)
then
1018 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i1d_ptr_a)
1020 i1d_ptr_a(hh) = int( vect_inc(index + 1) )
1023 else if (poolitr % dataType == mpas_pool_real)
then
1024 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r1d_ptr_a)
1026 r1d_ptr_a(hh) = vect_inc(index + 1)
1030 elseif (poolitr % nDims == 2)
then
1032 nhoriz = dimsizes(2)
1033 if (poolitr % dataType == mpas_pool_integer)
then
1034 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), i2d_ptr_a)
1037 i2d_ptr_a(vv, hh) = int( vect_inc(index + 1) )
1041 else if (poolitr % dataType == mpas_pool_real)
then
1042 call mpas_pool_get_array(self%subFields, trim(poolitr % memberName), r2d_ptr_a)
1045 r2d_ptr_a(vv, hh) = vect_inc(index + 1)
1051 write(
message,*)
'--> deserialize_fields: poolItr % nDims == ',poolitr % nDims,
' not handled'
1054 deallocate(dimsizes)
1063 character(len=*),
intent(in) :: fieldname
1065 has = (ufo_vars_getindex(self % fldnames, fieldname) > 0)
1070 character(len=*),
intent(in) :: fieldnames(:)
1072 logical,
allocatable :: has(:)
1073 allocate(has(
size(fieldnames)))
1074 do i = 1,
size(fieldnames)
1075 has(i) = self%has(fieldnames(i))
1082 character (len=*),
intent(in) :: key
1083 type(mpas_pool_data_type),
pointer,
intent(out) :: data
1084 if (self%has(key))
then
1085 data => pool_get_member(self % subFields, key, mpas_pool_field)
1087 write(
message,*)
'self%get_data: field not present, ', key
1094 character (len=*),
intent(in) :: key
1095 type(field1dinteger),
pointer,
intent(out) :: i1
1096 type(mpas_pool_data_type),
pointer :: data
1097 call self%get(key, data)
1103 character (len=*),
intent(in) :: key
1104 type(field2dinteger),
pointer,
intent(out) :: i2
1105 type(mpas_pool_data_type),
pointer :: data
1106 call self%get(key, data)
1112 character (len=*),
intent(in) :: key
1113 type(field1dreal),
pointer,
intent(out) :: r1
1114 type(mpas_pool_data_type),
pointer :: data
1115 call self%get(key, data)
1121 character (len=*),
intent(in) :: key
1122 type(field2dreal),
pointer,
intent(out) :: r2
1123 type(mpas_pool_data_type),
pointer :: data
1124 call self%get(key, data)
1130 character (len=*),
intent(in) :: key
1131 integer,
pointer,
intent(out) :: i1(:)
1132 type(mpas_pool_data_type),
pointer :: data
1133 call self%get(key, data)
1139 character (len=*),
intent(in) :: key
1140 integer,
pointer,
intent(out) :: i2(:,:)
1141 type(mpas_pool_data_type),
pointer :: data
1142 call self%get(key, data)
1148 character (len=*),
intent(in) :: key
1149 real(kind=kind_real),
pointer,
intent(out) :: r1(:)
1150 type(mpas_pool_data_type),
pointer :: data
1151 call self%get(key, data)
1157 character (len=*),
intent(in) :: key
1158 real(kind=kind_real),
pointer,
intent(out) :: r2(:,:)
1159 type(mpas_pool_data_type),
pointer :: data
1160 call self%get(key, data)
1168 type(mpas_pool_type),
pointer,
intent(in) :: from
1169 type(mpas_pool_type),
pointer,
intent(inout) :: to
1170 character (len=*),
intent(in) :: fromKey, toKey
1171 type(mpas_pool_data_type),
pointer :: toData, fromData
1172 todata => pool_get_member(to, tokey, mpas_pool_field)
1173 if (
associated(todata))
then
1174 fromdata => pool_get_member(from, fromkey, mpas_pool_field)
1175 if (
associated(fromdata))
then
1176 if (
associated(fromdata%r1) .and.
associated(todata%r1))
then
1177 todata%r1%array = fromdata%r1%array
1178 else if (
associated(fromdata%r2) .and.
associated(todata%r2))
then
1179 todata%r2%array = fromdata%r2%array
1180 else if (
associated(fromdata%r3) .and.
associated(todata%r3))
then
1181 todata%r3%array = fromdata%r3%array
1182 else if (
associated(fromdata%i1) .and.
associated(todata%i1))
then
1183 todata%i1%array = fromdata%i1%array
1184 else if (
associated(fromdata%i2) .and.
associated(todata%i2))
then
1185 todata%i2%array = fromdata%i2%array
1187 call abor1_ftn(
'copy_field_between_pools: data mismatch between to/from pools')
1190 write(
message,*)
'copy_field_between_pools: field not present in "from" pool, ', fromkey
1194 write(
message,*)
'copy_field_between_pools: field not present in "to" pool, ', tokey
1202 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1203 character (len=*),
intent(in) :: selfKey, otherKey
1204 type(mpas_pool_data_type),
pointer :: selfData, otherData
1210 character (len=*),
intent(in) :: key
1211 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1212 call self%copy_from(key, otherpool, key)
1218 character (len=*),
intent(in) :: selfKey, otherKey
1219 call self%copy_from(selfkey, other%subFields, otherkey)
1224 character (len=*),
intent(in) :: key
1226 call self%copy_from(key, other%subFields, key)
1232 type(mpas_pool_type),
pointer,
intent(inout) :: otherPool
1233 character (len=*),
intent(in) :: selfKey, otherKey
1234 type(mpas_pool_data_type),
pointer :: selfData, otherData
1240 character (len=*),
intent(in) :: key
1241 type(mpas_pool_type),
pointer,
intent(inout) :: otherPool
1242 call self%copy_to(key, otherpool, key)
1248 character (len=*),
intent(in) :: selfKey, otherKey
1249 call self%copy_to(selfkey, other%subFields, otherkey)
1254 character (len=*),
intent(in) :: key
1256 call self%copy_to(key, other%subFields, key)
1262 type(mpas_pool_type),
pointer,
intent(inout) :: to
1263 type(mpas_pool_type),
pointer,
intent(in) :: from
1264 character (len=*),
intent(in) :: fromKey, toKey
1265 type(mpas_pool_data_type),
pointer :: toData, fromData
1266 todata => pool_get_member(to, tokey, mpas_pool_field)
1267 if (
associated(todata))
then
1268 fromdata => pool_get_member(from, fromkey, mpas_pool_field)
1269 if (
associated(fromdata))
then
1270 if (
associated(fromdata%r1) .and.
associated(todata%r1))
then
1271 todata%r1%array = todata%r1%array + fromdata%r1%array
1272 else if (
associated(fromdata%r2) .and.
associated(todata%r2))
then
1273 todata%r2%array = todata%r2%array + fromdata%r2%array
1274 else if (
associated(fromdata%r3) .and.
associated(todata%r3))
then
1275 todata%r3%array = todata%r3%array + fromdata%r3%array
1277 call abor1_ftn(
'copy_field_between_pools_ad: data mismatch between to/from pools')
1280 write(
message,*)
'copy_field_between_pools_ad: field not present in "from" pool, ', fromkey
1284 write(
message,*)
'copy_field_between_pools_ad: field not present in "to" pool, ', tokey
1292 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1293 character (len=*),
intent(in) :: selfKey, otherKey
1294 type(mpas_pool_data_type),
pointer :: selfData, otherData
1300 character (len=*),
intent(in) :: key
1301 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1302 call self%copy_to_ad(key, otherpool, key)
1308 character (len=*),
intent(in) :: selfKey, otherKey
1309 call self%copy_to_ad(selfkey, other%subFields, otherkey)
1314 character (len=*),
intent(in) :: key
1316 call self%copy_to_ad(key, other%subFields, key)
1323 type(mpas_pool_type),
pointer,
intent(inout) :: to
1324 type(mpas_pool_type),
pointer,
intent(in) :: from
1325 character (len=*),
intent(in) :: fromKey, toKey
1326 type(mpas_pool_data_type),
pointer :: fromData
1327 type(field1dreal),
pointer :: fieldr1
1328 type(field2dreal),
pointer :: fieldr2
1329 type(field3dreal),
pointer :: fieldr3
1330 type(field1dinteger),
pointer :: fieldi1
1331 type(field2dinteger),
pointer :: fieldi2
1332 fromdata => pool_get_member(from, fromkey, mpas_pool_field)
1333 if (
associated(fromdata))
then
1334 if (
associated(fromdata%r1))
then
1335 call mpas_duplicate_field(fromdata%r1, fieldr1)
1336 fieldr1 % fieldName = tokey
1337 call mpas_pool_add_field(to, tokey, fieldr1)
1338 else if (
associated(fromdata%r2))
then
1339 call mpas_duplicate_field(fromdata%r2, fieldr2)
1340 fieldr2 % fieldName = tokey
1341 call mpas_pool_add_field(to, tokey, fieldr2)
1342 else if (
associated(fromdata%r3))
then
1343 call mpas_duplicate_field(fromdata%r3, fieldr3)
1344 fieldr3 % fieldName = tokey
1345 call mpas_pool_add_field(to, tokey, fieldr3)
1346 else if (
associated(fromdata%i1))
then
1347 call mpas_duplicate_field(fromdata%i1, fieldi1)
1348 fieldi1 % fieldName = tokey
1349 call mpas_pool_add_field(to, tokey, fieldi1)
1350 else if (
associated(fromdata%i2))
then
1351 call mpas_duplicate_field(fromdata%i2, fieldi2)
1352 fieldi2 % fieldName = tokey
1353 call mpas_pool_add_field(to, tokey, fieldi2)
1355 call abor1_ftn(
'pool_push_back_field_from_pool: data type not supported')
1358 write(
message,*)
'pool_push_back_field_from_pool: field not present in "from" pool, ', fromkey
1365 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1366 character (len=*),
intent(in) :: selfKey, otherKey
1367 type(mpas_pool_data_type),
pointer :: selfData, otherData
1368 character(len=MAXVARLEN),
allocatable :: fldnames(:)
1369 if (self%has(selfkey))
then
1370 write(
message,*)
'push_back_other_pool_field: field already present in self, cannot push_back, ', selfkey
1378 allocate(fldnames(self%nf+1))
1379 fldnames(1:self%nf) = self%fldnames(:)
1380 fldnames(self%nf+1) = trim(selfkey)
1382 deallocate(self%fldnames)
1383 allocate(self%fldnames(self%nf))
1384 self%fldnames = fldnames
1385 deallocate(fldnames)
1390 character (len=*),
intent(in) :: key
1391 type(mpas_pool_type),
pointer,
intent(in) :: otherPool
1392 call self%push_back(key, otherpool, key)
1398 character (len=*),
intent(in) :: selfKey, otherKey
1399 call self%push_back(selfkey, other%subFields, otherkey)
1404 character (len=*),
intent(in) :: key
1406 call self%push_back(key, other%subFields, key)
elemental subroutine, public w_to_q(mixing_ratio, specific_humidity)
elemental subroutine, public theta_to_temp(theta, pressure, temperature)
subroutine, public da_self_mult(pool_a, zz)
Performs A = A * zz for pool A, zz a real number.
subroutine, public da_dot_product(pool_a, pool_b, dminfo, zprod)
Performs the dot_product given two pools of fields.
subroutine, public da_constant(pool_a, realvalue, fld_select)
Performs A = constant. for pool A.
subroutine, public da_operator(kind_op, pool_a, pool_b, pool_c, fld_select)
Performs A = A 'kind_op' B for pools A and B.
character(len=1024) message
subroutine, public cvt_oopsmpas_date(inString2, outString2, iconv)
subroutine, public da_template_pool(geom, templatePool, nf, fieldnames)
Subset a pool from fields described in geom.
subroutine, public da_fldrms(pool_a, dminfo, fldrms, fld_select)
Performs basic statistics min/max/norm given a pool.
subroutine, public da_copy_all2sub_fields(domain, pool_a)
Performs a copy of allfield to a sub pool A.
subroutine, public da_copy_sub2all_fields(domain, pool_a)
Performs a copy of a sub pool A to allfields.
subroutine, public da_axpy(pool_a, pool_b, zz, fld_select)
Performs A = A + B * zz for pools A and B.
subroutine, public da_gpnorm(pool_a, dminfo, nf, pstat, fld_select)
Performs basic statistics min/max/norm given a pool.
subroutine, public da_random(pool_a, fld_select)
Performs random for pool A.
real(kind=kind_real), parameter mpas_jedi_zero_kr
real(kind=kind_real), parameter mpas_jedi_rad2deg_kr
real(kind=kind_real), parameter mpas_jedi_one_kr
subroutine pool_push_back_field_from_pool(to, toKey, from, fromKey)
subroutine initialize_bumpinterp(geom_to, geom_from, bumpinterp)
Initializes a bump interpolation type.
subroutine serialize_fields(self, vsize, vect_inc)
subroutine interpolate_fields(self, rhs)
Populates subfields of self using rhs.
subroutine copy_to_other_fields_field_ad(self, selfKey, other, otherKey)
character(len=maxvarlen), dimension(2), parameter, public cellcenteredwindfields
subroutine get_field_r1(self, key, r1)
type(registry_t), public mpas_fields_registry
Linked list interface - defines registry_t type.
subroutine, public create_fields(self, geom, vars, vars_ci)
Linked list implementation.
subroutine push_back_other_fields(self, key, other)
subroutine push_back_other_fields_field(self, selfKey, other, otherKey)
subroutine copy_from_other_pool(self, key, otherPool)
subroutine get_field_r2(self, key, r2)
subroutine axpy_(self, zz, rhs)
subroutine copy_to_other_pool(self, key, otherPool)
subroutine get_field_i2(self, key, i2)
subroutine self_schur_(self, rhs)
subroutine self_add_(self, rhs)
character(len=maxvarlen), dimension(4), parameter, public modelthermofields
subroutine write_fields(self, f_conf, vdate)
subroutine self_mult_(self, zz)
subroutine, public delete_fields(self)
subroutine rms_(self, prms)
character(len=maxvarlen), dimension(3), public mpas_re_fields
logical function, dimension(:), allocatable has_fields(self, fieldnames)
subroutine deserialize_fields(self, vsize, vect_inc, index)
subroutine copy_to_other_pool_field_ad(self, selfKey, otherPool, otherKey)
subroutine get_field_i1(self, key, i1)
integer, parameter max_string
subroutine get_array_r2(self, key, r2)
character(len=maxvarlen), dimension(6), public mpas_hydrometeor_fields
subroutine copy_from_other_fields_field(self, selfKey, other, otherKey)
subroutine get_array_i1(self, key, i1)
subroutine copy_from_other_pool_field(self, selfKey, otherPool, otherKey)
subroutine copy_to_other_fields(self, key, other)
subroutine, public copy_fields(self, rhs)
subroutine read_fields(self, f_conf, vdate)
subroutine get_array_r1(self, key, r1)
subroutine gpnorm_(self, nf, pstat)
subroutine, public update_diagnostic_fields(domain, subFields, ngrid)
logical function has_field(self, fieldname)
subroutine get_data(self, key, data)
subroutine serial_size(self, vsize)
subroutine self_sub_(self, rhs)
character(len=maxvarlen), dimension(2), parameter, public moisturefields
subroutine initialize_uns_interp(geom_to, geom_from, unsinterp)
Initializes an unstructured interpolation type.
character(len=maxvarlen), dimension(2), parameter, public analysisthermofields
subroutine copy_from_other_fields(self, key, other)
subroutine copy_to_other_fields_field(self, selfKey, other, otherKey)
subroutine push_back_other_pool_field(self, selfKey, otherPool, otherKey)
subroutine copy_field_between_pools(from, fromKey, to, toKey)
subroutine copy_field_between_pools_ad(to, toKey, from, fromKey)
subroutine get_array_i2(self, key, i2)
subroutine, public copy_pool(pool_src, pool)
subroutine dot_prod_(self, fld, zprod)
subroutine delete_pool(pool)
subroutine copy_to_other_fields_ad(self, key, other)
subroutine copy_to_other_pool_field(self, selfKey, otherPool, otherKey)
subroutine populate_subfields(self)
subroutine copy_to_other_pool_ad(self, key, otherPool)
subroutine push_back_other_pool(self, key, otherPool)
subroutine change_resol_fields(self, rhs)
integer function, dimension(:), allocatable, public getsolvedimsizes(pool, key, dimPool)
Returns an array with the dimension sizes of a pool field member.
Fortran derived type to hold MPAS field.
Fortran derived type to hold geometry definition.