11 use atlas_module,
only: atlas_field, atlas_fieldset, atlas_real
12 use fckit_configuration_module,
only: fckit_configuration
15 use fckit_log_module,
only: fckit_log
18 use missing_values_mod
55 real(kind_real),
allocatable :: gfld3d(:,:,:)
56 real(kind_real),
allocatable :: x_north(:)
57 real(kind_real),
allocatable :: x_south(:)
58 real(kind_real),
allocatable :: q_north(:,:)
59 real(kind_real),
allocatable :: q_south(:,:)
62 #define LISTED_TYPE qg_fields
65 #include "oops/util/linkedList_i.f"
75 #include "oops/util/linkedList_c.f"
84 type(
qg_geom),
target,
intent(in) :: geom
86 logical,
intent(in) :: lbc
89 character(len=1024) :: record
95 if (vars%has(
'x') .and. vars%has(
'q'))
then
96 call abor1_ftn(
'qg_fields_create: x and q cannot be set as fields together')
97 elseif (vars%has(
'u') .or. vars%has(
'v'))
then
98 call abor1_ftn(
'qg_fieldsçcreate: u and v cannot be set as fields')
99 elseif (vars%has(
'x'))
then
101 elseif (vars%has(
'q'))
then
104 call abor1_ftn(
'qg_fields_create: x or q should be set as fields')
111 allocate(self%gfld3d(self%geom%nx,self%geom%ny,self%geom%nz))
116 allocate(self%x_north(self%geom%nz))
117 allocate(self%x_south(self%geom%nz))
118 allocate(self%q_north(self%geom%nx,self%geom%nz))
119 allocate(self%q_south(self%geom%nx,self%geom%nz))
134 type(
qg_geom),
target,
intent(in) :: geom
135 logical,
intent(in) :: lbc
138 character(len=1024) :: record
150 allocate(self%gfld3d(self%geom%nx,self%geom%ny,self%geom%nz))
155 allocate(self%x_north(self%geom%nz))
156 allocate(self%x_south(self%geom%nz))
157 allocate(self%q_north(self%geom%nx,self%geom%nz))
158 allocate(self%q_south(self%geom%nx,self%geom%nz))
176 self%geom => other%geom
183 allocate(self%gfld3d(self%geom%nx,self%geom%ny,self%geom%nz))
188 allocate(self%x_north(self%geom%nz))
189 allocate(self%x_south(self%geom%nz))
190 allocate(self%q_north(self%geom%nx,self%geom%nz))
191 allocate(self%q_south(self%geom%nx,self%geom%nz))
208 if (
allocated(self%gfld3d))
deallocate(self%gfld3d)
209 if (
allocated(self%x_north))
deallocate(self%x_north)
210 if (
allocated(self%x_south))
deallocate(self%x_south)
211 if (
allocated(self%q_north))
deallocate(self%q_north)
212 if (
allocated(self%q_south))
deallocate(self%q_south)
267 type(fckit_configuration),
intent(in) :: f_conf
271 integer,
allocatable :: ixdir(:),iydir(:),izdir(:)
277 ndir = f_conf%get_size(
'ixdir')
278 if ((f_conf%get_size(
'iydir')/=ndir).or.(f_conf%get_size(
'izdir')/=ndir)) &
279 &
call abor1_ftn(
'qg_fields_dirac: inconsistent sizes for ixdir, iydir and izdir')
282 allocate(ixdir(ndir))
283 allocate(iydir(ndir))
284 allocate(izdir(ndir))
287 call f_conf%get_or_die(
"ixdir",ixdir)
288 call f_conf%get_or_die(
"iydir",iydir)
289 call f_conf%get_or_die(
"izdir",izdir)
292 if (any(ixdir<1).or.any(ixdir>self%geom%nx))
call abor1_ftn(
'qg_fields_dirac: invalid ixdir')
293 if (any(iydir<1).or.any(iydir>self%geom%ny))
call abor1_ftn(
'qg_fields_dirac: invalid iydir')
294 if (any(izdir<1).or.any(izdir>self%geom%nz))
call abor1_ftn(
'qg_fields_dirac: invalid izdir')
298 self%gfld3d(ixdir(idir),iydir(idir),izdir(idir)) = 1.0
315 call normal_distribution(self%gfld3d,0.0_kind_real,1.0_kind_real,
rseed)
327 logical,
intent(in),
optional :: bconly
334 if (
present(bconly)) lbconly = bconly
339 if (.not.lbconly)
then
344 self%gfld3d = other%gfld3d
349 self%x_north = other%x_north
350 self%x_south = other%x_south
351 self%q_north = other%q_north
352 self%q_south = other%q_south
377 self%gfld3d = self%gfld3d+rhs%gfld3d
378 if (self%lbc.and.rhs%lbc)
then
379 self%x_north = self%x_north+rhs%x_north
380 self%x_south = self%x_south+rhs%x_south
381 self%q_north = self%q_north+rhs%q_north
382 self%q_south = self%q_south+rhs%q_south
401 self%gfld3d = self%gfld3d-rhs%gfld3d
402 if (self%lbc.and.rhs%lbc)
then
403 self%x_north = self%x_north-rhs%x_north
404 self%x_south = self%x_south-rhs%x_south
405 self%q_north = self%q_north-rhs%q_north
406 self%q_south = self%q_south-rhs%q_south
418 real(kind_real),
intent(in) :: zz
424 self%gfld3d = zz*self%gfld3d
426 self%x_north = zz*self%x_north
427 self%x_south = zz*self%x_south
428 self%q_north = zz*self%q_north
429 self%q_south = zz*self%q_south
441 real(kind_real),
intent(in) :: zz
449 self%gfld3d = self%gfld3d+zz*rhs%gfld3d
450 if (self%lbc.and.rhs%lbc)
then
451 self%x_north = self%x_north+zz*rhs%x_north
452 self%x_south = self%x_south+zz*rhs%x_south
453 self%q_north = self%q_north+zz*rhs%q_north
454 self%q_south = self%q_south+zz*rhs%q_south
473 self%gfld3d = self%gfld3d*rhs%gfld3d
474 if (self%lbc.and.rhs%lbc)
then
475 self%x_north = self%x_north*rhs%x_north
476 self%x_south = self%x_south*rhs%x_south
477 self%q_north = self%q_north*rhs%q_north
478 self%q_south = self%q_south*rhs%q_south
491 real(kind_real),
intent(out) :: zprod
498 zprod = sum(fld1%gfld3d*fld2%gfld3d)
515 if (self%lq.eqv.rhs%lq)
then
516 if ((self%geom%nx==rhs%geom%nx).and.(self%geom%ny==rhs%geom%ny).and.(self%geom%nz==rhs%geom%nz))
then
518 self%gfld3d = self%gfld3d+rhs%gfld3d
521 call abor1_ftn(
'qg_fields_add_incr: not coded for low res increment yet')
524 call abor1_ftn(
'qg_fields_add_incr: different variables')
547 if (lhs%lq.eqv.fld1%lq)
then
548 if ((fld1%geom%nx==lhs%geom%nx).and.(fld1%geom%ny==lhs%geom%ny).and.(fld1%geom%nz==lhs%geom%nz))
then
550 lhs%gfld3d = fld1%gfld3d-fld2%gfld3d
553 call abor1_ftn(
'qg_fields_diff_incr: not coded for low res increment yet')
556 call abor1_ftn(
'qg_fields_diff_incr: different variables')
571 real(kind_real),
allocatable,
dimension(:,:,:) :: q1, q2
577 if (fld%lq.eqv.rhs%lq)
then
578 if ((fld%geom%nx==rhs%geom%nx).and.(fld%geom%ny==rhs%geom%ny).and.(fld%geom%nz==rhs%geom%nz))
then
582 do ix = 1,fld%geom%nx
583 do iy = 1,fld%geom%ny
584 do iz = 1,fld%geom%nz
585 call qg_interp_trilinear( rhs%geom,fld%geom%lon(ix,iy),fld%geom%lat(ix,iy),fld%geom%z(iz), &
586 rhs%gfld3d,fld%gfld3d(ix,iy,iz) )
592 allocate(q1(rhs%geom%nx,rhs%geom%ny,rhs%geom%nz))
593 allocate(q2(fld%geom%nx,fld%geom%ny,fld%geom%nz))
594 do iy = 1,rhs%geom%ny
595 q1(:,iy,:) = rhs%q_south
597 do ix = 1,fld%geom%nx
598 do iz = 1,fld%geom%nz
603 fld%q_south = q2(:,1,:)
604 do iy = 1,rhs%geom%ny
605 q1(:,iy,:) = rhs%q_north
607 do ix = 1,fld%geom%nx
608 do iz = 1,fld%geom%nz
613 fld%q_north = q2(:,1,:)
615 fld%x_north = rhs%x_north
616 fld%x_south = rhs%x_south
626 call abor1_ftn(
'qg_fields_change_resol: different variables')
639 type(fckit_configuration),
intent(in) :: f_conf
640 type(datetime),
intent(inout) :: vdate
643 integer :: iread,nx,ny,nz,bc
644 integer :: ncid,nx_id,ny_id,nz_id,gfld3d_id,x_north_id,x_south_id,q_north_id,q_south_id
646 character(len=20) :: sdate
647 character(len=1024) :: record,filename
648 character(len=:),
allocatable :: str
655 if (f_conf%has(
"read_from_file"))
call f_conf%get_or_die(
"read_from_file",iread)
659 call fckit_log%warning(
'qg_fields_read_file: inventing field')
665 call f_conf%get_or_die(
"filename",str)
666 call swap_name_member(f_conf, str)
668 call fckit_log%info(
'qg_fields_read_file: opening '//trim(filename))
674 call ncerr(nf90_open(trim(filename),nf90_nowrite,ncid))
677 call ncerr(nf90_inq_dimid(ncid,
'nx',nx_id))
678 call ncerr(nf90_inq_dimid(ncid,
'ny',ny_id))
679 call ncerr(nf90_inq_dimid(ncid,
'nz',nz_id))
682 call ncerr(nf90_inquire_dimension(ncid,nx_id,len=nx))
683 call ncerr(nf90_inquire_dimension(ncid,ny_id,len=ny))
684 call ncerr(nf90_inquire_dimension(ncid,nz_id,len=nz))
687 if ((nx/=fld%geom%nx).or.(ny/=fld%geom%ny).or.(nz/=fld%geom%nz))
then
688 write (record,*)
'qg_fields_read_file: input fields have wrong dimensions: ',nx,ny,nz
689 call fckit_log%error(record)
690 write (record,*)
'qg_fields_read_file: expected: ',fld%geom%nx,fld%geom%ny,fld%geom%nz
691 call fckit_log%error(record)
692 call abor1_ftn(
'qg_fields_read_file: input fields have wrong dimensions')
696 call ncerr(nf90_get_att(ncid,nf90_global,
'bc',bc))
702 call abor1_ftn(
'qg_fields_read_file: wrong bc value')
704 call ncerr(nf90_get_att(ncid,nf90_global,
'sdate',sdate))
707 if ((.not.lbc).and.fld%lbc)
call abor1_ftn(
'qg_fields_read_file: LBC are missing in NetCDF file')
711 call ncerr(nf90_inq_varid(ncid,
'q',gfld3d_id))
713 call ncerr(nf90_inq_varid(ncid,
'x',gfld3d_id))
716 call ncerr(nf90_inq_varid(ncid,
'x_north',x_north_id))
717 call ncerr(nf90_inq_varid(ncid,
'x_south',x_south_id))
718 call ncerr(nf90_inq_varid(ncid,
'q_north',q_north_id))
719 call ncerr(nf90_inq_varid(ncid,
'q_south',q_south_id))
723 call ncerr(nf90_get_var(ncid,gfld3d_id,fld%gfld3d))
725 call ncerr(nf90_get_var(ncid,x_north_id,fld%x_north))
726 call ncerr(nf90_get_var(ncid,x_south_id,fld%x_south))
727 call ncerr(nf90_get_var(ncid,q_north_id,fld%q_north))
728 call ncerr(nf90_get_var(ncid,q_south_id,fld%q_south))
732 call ncerr(nf90_close(ncid))
735 call fckit_log%info(
'qg_fields_read_file: validity date is '//sdate)
736 call datetime_set(sdate,vdate)
751 type(fckit_configuration),
intent(in) :: f_conf
752 type(datetime),
intent(in) :: vdate
755 integer :: ncid,nx_id,ny_id,nz_id,lon_id,lat_id,z_id,area_id,heat_id,x_id,q_id,u_id,v_id
756 integer :: x_north_id,x_south_id,q_north_id,q_south_id
758 real(kind_real) :: x(fld%geom%nx,fld%geom%ny,fld%geom%nz),q(fld%geom%nx,fld%geom%ny,fld%geom%nz)
759 real(kind_real) :: u(fld%geom%nx,fld%geom%ny,fld%geom%nz),v(fld%geom%nx,fld%geom%ny,fld%geom%nz)
760 logical :: lwx,lwq,lwuv,ismpi,mainpe
761 character(len=20) :: sdate
762 character(len=1024) :: filename
798 call fckit_log%info(
'qg_fields_write_file: writing '//trim(filename))
801 call datetime_to_string(vdate,sdate)
804 call ncerr(nf90_create(trim(filename),or(nf90_clobber,nf90_64bit_offset),ncid))
807 call ncerr(nf90_def_dim(ncid,
'nx',fld%geom%nx,nx_id))
808 call ncerr(nf90_def_dim(ncid,
'ny',fld%geom%ny,ny_id))
809 call ncerr(nf90_def_dim(ncid,
'nz',fld%geom%nz,nz_id))
813 call ncerr(nf90_put_att(ncid,nf90_global,
'bc',1))
815 call ncerr(nf90_put_att(ncid,nf90_global,
'bc',0))
817 call ncerr(nf90_put_att(ncid,nf90_global,
'sdate',sdate))
820 call ncerr(nf90_def_var(ncid,
'lon',nf90_double,(/nx_id,ny_id/),lon_id))
821 call ncerr(nf90_def_var(ncid,
'lat',nf90_double,(/nx_id,ny_id/),lat_id))
822 call ncerr(nf90_def_var(ncid,
'z',nf90_double,(/nz_id/),z_id))
823 call ncerr(nf90_def_var(ncid,
'area',nf90_double,(/nx_id,ny_id/),area_id))
824 call ncerr(nf90_def_var(ncid,
'heat',nf90_double,(/nx_id,ny_id/),heat_id))
826 call ncerr(nf90_def_var(ncid,
'x',nf90_double,(/nx_id,ny_id,nz_id/),x_id))
827 call ncerr(nf90_put_att(ncid,x_id,
'_FillValue',missing_value(1.0_kind_real)))
830 call ncerr(nf90_def_var(ncid,
'q',nf90_double,(/nx_id,ny_id,nz_id/),q_id))
831 call ncerr(nf90_put_att(ncid,q_id,
'_FillValue',missing_value(1.0_kind_real)))
834 call ncerr(nf90_def_var(ncid,
'u',nf90_double,(/nx_id,ny_id,nz_id/),u_id))
835 call ncerr(nf90_put_att(ncid,u_id,
'_FillValue',missing_value(1.0_kind_real)))
836 call ncerr(nf90_def_var(ncid,
'v',nf90_double,(/nx_id,ny_id,nz_id/),v_id))
837 call ncerr(nf90_put_att(ncid,v_id,
'_FillValue',missing_value(1.0_kind_real)))
840 call ncerr(nf90_def_var(ncid,
'x_north',nf90_double,(/nz_id/),x_north_id))
841 call ncerr(nf90_put_att(ncid,x_north_id,
'_FillValue',missing_value(1.0_kind_real)))
842 call ncerr(nf90_def_var(ncid,
'x_south',nf90_double,(/nz_id/),x_south_id))
843 call ncerr(nf90_put_att(ncid,x_south_id,
'_FillValue',missing_value(1.0_kind_real)))
844 call ncerr(nf90_def_var(ncid,
'q_north',nf90_double,(/nx_id,nz_id/),q_north_id))
845 call ncerr(nf90_put_att(ncid,q_north_id,
'_FillValue',missing_value(1.0_kind_real)))
846 call ncerr(nf90_def_var(ncid,
'q_south',nf90_double,(/nx_id,nz_id/),q_south_id))
847 call ncerr(nf90_put_att(ncid,q_south_id,
'_FillValue',missing_value(1.0_kind_real)))
851 call ncerr(nf90_enddef(ncid))
854 call ncerr(nf90_put_var(ncid,lon_id,fld%geom%lon))
855 call ncerr(nf90_put_var(ncid,lat_id,fld%geom%lat))
856 call ncerr(nf90_put_var(ncid,z_id,fld%geom%z))
857 call ncerr(nf90_put_var(ncid,area_id,fld%geom%area))
858 call ncerr(nf90_put_var(ncid,heat_id,fld%geom%heat))
859 if (lwx)
call ncerr(nf90_put_var(ncid,x_id,x))
860 if (lwq)
call ncerr(nf90_put_var(ncid,q_id,q))
862 call ncerr(nf90_put_var(ncid,u_id,u))
863 call ncerr(nf90_put_var(ncid,v_id,v))
866 call ncerr(nf90_put_var(ncid,x_north_id,fld%x_north))
867 call ncerr(nf90_put_var(ncid,x_south_id,fld%x_south))
868 call ncerr(nf90_put_var(ncid,q_north_id,fld%q_north))
869 call ncerr(nf90_put_var(ncid,q_south_id,fld%q_south))
873 call ncerr(nf90_close(ncid))
884 type(fckit_configuration),
intent(in) :: f_conf
885 type(datetime),
intent(inout) :: vdate
889 real(kind_real) :: uval
890 real(kind_real),
allocatable :: x(:,:,:),q(:,:,:)
891 character(len=30) :: ic
892 character(len=20) :: sdate
893 character(len=:),
allocatable :: str
896 if (f_conf%has(
"analytic_init"))
then
897 call f_conf%get_or_die(
"analytic_init",str)
900 ic =
'baroclinic-instability'
902 call fckit_log%warning(
'qg_fields_analytic_init: '//trim(ic))
905 call f_conf%get_or_die(
"date",str)
907 call fckit_log%info(
'qg_fields_analytic_init: validity date is '//sdate)
908 call datetime_set(sdate,vdate)
911 if (.not.fld%lbc)
call abor1_ftn(
'qg_fields_analytic_init: boundaries required')
914 allocate(x(fld%geom%nx,fld%geom%ny,fld%geom%nz))
915 allocate(q(fld%geom%nx,fld%geom%ny,fld%geom%nz))
918 select case (trim(ic))
919 case (
'baroclinic-instability')
930 case (
'large-vortices')
935 call large_vortices(fld%geom%x(ix),fld%geom%y(iy),fld%geom%z(iz),
'x',x(ix,iy,iz))
939 call large_vortices(0.0_kind_real,0.0_kind_real,fld%geom%z(iz),
'x',fld%x_south(iz))
941 case (
'uniform_field')
943 call f_conf%get_or_die(
"uval",uval)
946 call abor1_ftn (
'qg_fields_analytic_init: unknown initialization')
953 fld%q_south(ix,iz) = 2.0*q(ix,1,iz)-q(ix,2,iz)
956 fld%q_north(ix,iz) = 2.0*q(ix,fld%geom%ny,iz)-q(ix,fld%geom%ny-1,iz)
979 integer,
intent(in) :: nb
980 real(kind_real),
intent(inout) :: pstat(4*(1+nb))
984 real(kind_real) :: expo,stat(4,1+nb)
990 if ((fld%lbc.and.(nb/=2)).or.((.not.fld%lbc).and.(nb>0)))
call abor1_ftn(
'qg_fields_gpnorm: error number of fields')
993 stat(2,1) = minval(fld%gfld3d)
994 stat(3,1) = maxval(fld%gfld3d)
995 stat(4,1) = sqrt(sum(fld%gfld3d**2)/real(fld%geom%nx*fld%geom%ny*fld%geom%nz,kind_real))
996 if (stat(4,1)>0.0)
then
997 expo = aint(log(stat(4,1))/log(10.0_kind_real))
998 stat(1,1) = 10.0**expo
1002 stat(2:4,1) = stat(2:4,1)/stat(1,1)
1007 stat(2,2) = min(minval(fld%x_north),minval(fld%x_south))
1008 stat(3,2) = max(maxval(fld%x_north),maxval(fld%x_south))
1009 stat(4,2) = sqrt(sum(fld%x_north**2+fld%x_south**2)/real(2*fld%geom%nz,kind_real))
1010 if (stat(4,2)>0.0)
then
1011 expo = aint(log(stat(4,2))/log(10.0_kind_real))
1012 stat(1,2) = 10.0**expo
1016 stat(2:4,2) = stat(2:4,2)/stat(1,2)
1019 stat(2,3) = min(minval(fld%q_north),minval(fld%q_south))
1020 stat(3,3) = max(maxval(fld%q_north),maxval(fld%q_south))
1021 stat(4,3) = sqrt(sum(fld%q_north**2+fld%q_south**2)/real(2*fld%geom%nx*fld%geom%nz,kind_real))
1022 if (stat(4,3)>0.0)
then
1023 expo = aint(log(stat(4,3))/log(10.0_kind_real))
1024 stat(1,3) = 10.0**expo
1028 stat(2:4,3) = stat(2:4,3)/stat(1,3)
1036 pstat(jj) = stat(js,jvb)
1049 real(kind_real),
intent(out) :: prms
1053 real(kind_real) :: zz
1059 zz = sum(fld%gfld3d**2)
1060 norm = fld%geom%nx*fld%geom%ny*fld%geom%nz
1064 zz = zz+sum(fld%x_north**2+fld%x_south**2)+sum(fld%q_north**2+fld%q_south**2)
1065 norm = norm+2*(1+fld%geom%nx)*fld%geom%nz
1069 prms = sqrt(zz/real(norm,kind_real))
1080 integer,
intent(out) :: nx
1081 integer,
intent(out) :: ny
1082 integer,
intent(out) :: nz
1083 integer,
intent(out) :: nb
1106 integer,
intent(out) :: lq
1107 integer,
intent(out) :: lbc
1133 type(atlas_fieldset),
intent(inout) :: afieldset
1136 character(len=1024) :: fieldname
1137 type(atlas_field) :: afield
1140 if (vars%has(
'x')) fieldname =
'x'
1141 if (vars%has(
'q')) fieldname =
'q'
1142 if (afieldset%has_field(trim(fieldname)))
then
1144 afield = afieldset%field(trim(fieldname))
1147 afield = self%geom%afunctionspace%create_field(name=trim(fieldname),kind=atlas_real(kind_real),levels=self%geom%nz)
1150 call afieldset%add(afield)
1166 type(atlas_fieldset),
intent(inout) :: afieldset
1169 integer :: iv,ix,iy,iz,inode
1170 integer(kind_int),
pointer :: int_ptr_1(:),int_ptr_2(:,:)
1171 real(kind_real) :: gfld3d(self%geom%nx,self%geom%ny,self%geom%nz)
1172 real(kind_real),
pointer :: real_ptr_1(:),real_ptr_2(:,:)
1173 character(len=1024) :: fieldname
1174 type(atlas_field) :: afield
1177 if (vars%has(
'x'))
then
1179 call convert_q_to_x(self%geom,self%gfld3d,self%x_north,self%x_south,gfld3d)
1181 gfld3d = self%gfld3d
1184 if (vars%has(
'q'))
then
1186 gfld3d = self%gfld3d
1188 call convert_x_to_q(self%geom,self%gfld3d,self%x_north,self%x_south,gfld3d)
1193 if (vars%has(
'x')) fieldname =
'x'
1194 if (vars%has(
'q')) fieldname =
'q'
1195 if (afieldset%has_field(trim(fieldname)))
then
1197 afield = afieldset%field(trim(fieldname))
1200 afield = self%geom%afunctionspace%create_field(name=trim(fieldname),kind=atlas_real(kind_real),levels=self%geom%nz)
1203 call afieldset%add(afield)
1207 call afield%data(real_ptr_2)
1208 do iz=1,self%geom%nz
1210 do iy=1,self%geom%ny
1211 do ix=1,self%geom%nx
1213 real_ptr_2(iz,inode) = gfld3d(ix,iy,iz)
1231 type(atlas_fieldset),
intent(inout) :: afieldset
1234 integer :: ix,iy,iz,inode
1235 real(kind_real) :: gfld3d(self%geom%nx,self%geom%ny,self%geom%nz)
1236 real(kind_real),
pointer :: real_ptr_1(:),real_ptr_2(:,:)
1237 character(len=1) :: cgrid
1238 character(len=1024) :: fieldname
1239 type(atlas_field) :: afield
1242 if (vars%has(
'x')) fieldname =
'x'
1243 if (vars%has(
'q')) fieldname =
'q'
1244 afield = afieldset%field(trim(fieldname))
1247 call afield%data(real_ptr_2)
1248 do iz=1,self%geom%nz
1250 do iy=1,self%geom%ny
1251 do ix=1,self%geom%nx
1253 gfld3d(ix,iy,iz) = real_ptr_2(iz,inode)
1259 if (vars%has(
'x'))
then
1261 call convert_x_to_q(self%geom,gfld3d,self%x_north,self%x_south,self%gfld3d)
1263 self%gfld3d = gfld3d
1266 if (vars%has(
'q'))
then
1268 self%gfld3d = gfld3d
1270 call convert_x_to_q(self%geom,gfld3d,self%x_north,self%x_south,self%gfld3d)
1287 integer,
intent(in) :: nval
1288 real(kind_real),
intent(inout) :: vals(nval)
1291 character(len=1024) :: record
1294 if ((fld%geom%nx/=iter%geom%nx).or.(fld%geom%ny/=iter%geom%ny).or.(fld%geom%nz/=iter%geom%nz))
then
1295 write(record,*)
'qg_fields_getpoint: resolution inconsistency, ',fld%geom%nx,
'/',fld%geom%ny,
'/',fld%geom%nz, &
1296 &
' and ',iter%geom%nx,
'/',iter%geom%ny,
'/',iter%geom%nz
1297 call abor1_ftn(record)
1299 if (fld%geom%nz/=nval)
then
1300 write(record,*)
'qg_fields_getpoint: array sizes are different: ',fld%geom%nz,
'/',nval
1301 call abor1_ftn(record)
1305 vals = fld%gfld3d(iter%ilon,iter%ilat,:)
1317 integer,
intent(in) :: nval
1318 real(kind_real),
intent(in) :: vals(nval)
1321 character(len=1024) :: record
1324 if ((fld%geom%nx/=iter%geom%nx).or.(fld%geom%ny/=iter%geom%ny).or.(fld%geom%nz/=iter%geom%nz))
then
1325 write(record,*)
'qg_fields_getpoint: resolution inconsistency,',fld%geom%nx,
'/',fld%geom%ny,
'/',fld%geom%nz, &
1326 &
' and ',iter%geom%nx,
'/',iter%geom%ny,
'/',iter%geom%nz
1327 call abor1_ftn(record)
1329 if (fld%geom%nz/=nval)
then
1330 write(record,*)
'qg_fields_getpoint: array sizes are different:',fld%geom%nz,
'/',nval
1331 call abor1_ftn(record)
1335 fld%gfld3d(iter%ilon,iter%ilat,:) = vals
1346 integer,
intent(in) :: vsize
1347 real(kind_real),
intent(inout) :: vect_fld(vsize)
1350 integer :: ix,iy,iz,ind
1356 do iz = 1,fld%geom%nz
1357 do iy = 1,fld%geom%ny
1358 do ix = 1,fld%geom%nx
1360 vect_fld(ind) = fld%gfld3d(ix,iy,iz)
1368 vect_fld(ind) = fld%x_north(iz)
1370 vect_fld(ind) = fld%x_south(iz)
1373 vect_fld(ind) = fld%q_north(ix,iz)
1375 vect_fld(ind) = fld%q_south(ix,iz)
1389 integer,
intent(in) :: vsize
1390 real(kind_real),
intent(in) :: vect_fld(vsize)
1391 integer,
intent(inout) :: index
1398 do iz = 1,self%geom%nz
1399 do iy = 1,self%geom%ny
1400 do ix = 1,self%geom%nx
1401 self%gfld3d(ix,iy,iz) = vect_fld(index)
1409 do iz=1,self%geom%nz
1411 self%x_north(iz) = vect_fld(index)
1413 self%x_south(iz) = vect_fld(index)
1414 do ix=1,self%geom%nx
1416 self%q_north(ix,iz) = vect_fld(index)
1418 self%q_south(ix,iz) = vect_fld(index)
1437 character(len=1024) :: record
1443 bad = bad.or.(.not.
allocated(self%gfld3d))
1444 bad = bad.or.(
size(self%gfld3d,1)/=self%geom%nx)
1445 bad = bad.or.(
size(self%gfld3d,2)/=self%geom%ny)
1446 bad = bad.or.(
size(self%gfld3d,3)/=self%geom%nz)
1450 bad = bad.or.(.not.
allocated(self%x_north))
1451 bad = bad.or.(.not.
allocated(self%x_south))
1452 bad = bad.or.(.not.
allocated(self%q_north))
1453 bad = bad.or.(.not.
allocated(self%q_south))
1454 bad = bad.or.(
size(self%x_north)/=self%geom%nz)
1455 bad = bad.or.(
size(self%x_south)/=self%geom%nz)
1456 bad = bad.or.(
size(self%q_north,1)/=self%geom%nx)
1457 bad = bad.or.(
size(self%q_north,2)/=self%geom%nz)
1458 bad = bad.or.(
size(self%q_south,1)/=self%geom%nx)
1459 bad = bad.or.(
size(self%q_south,2)/=self%geom%nz)
1461 bad = bad.or.
allocated(self%x_north)
1462 bad = bad.or.
allocated(self%x_south)
1463 bad = bad.or.
allocated(self%q_north)
1464 bad = bad.or.
allocated(self%q_south)
1468 call fckit_log%info(
'qg_fields_check: field not consistent')
1469 write(record,*)
' nx,ny,nz,lbc = ',self%geom%nx,self%geom%ny,self%geom%nz,self%lbc
1470 call fckit_log%info(record)
1471 write(record,*)
' shape(gfld3d) = ',shape(self%gfld3d)
1472 call fckit_log%info(record)
1474 write(record,*)
' shape(x_north) = ',shape(self%x_north)
1475 call fckit_log%info(record)
1476 write(record,*)
' shape(x_south) = ',shape(self%x_south)
1477 call fckit_log%info(record)
1478 write(record,*)
' shape(q_north) = ',shape(self%q_north)
1479 call fckit_log%info(record)
1480 write(record,*)
' shape(q_south) = ',shape(self%q_south)
1481 call fckit_log%info(record)
1482 call abor1_ftn (
'qg_fields_check: field not consistent')
1498 character(len=1024) :: record
1501 if ((fld1%geom%nx/=fld2%geom%nx).or.(fld1%geom%ny/=fld2%geom%ny).or.(fld1%geom%nz/=fld2%geom%nz))
then
1502 write(record,*)
'qg_fields_check_resolution: resolution inconsistency, ',fld1%geom%nx,
'/',fld1%geom%ny,
'/',fld1%geom%nz, &
1503 &
' and ',fld2%geom%nx,
'/',fld2%geom%ny,
'/',fld2%geom%nz
1504 call abor1_ftn(record)
1523 character(len=1024) :: record
1526 if (fld1%lq.neqv.fld2%lq)
then
1527 write(record,*)
'qg_fields_check_variables: variables inconsistency, ',fld1%lq,
' and ',fld2%lq
1528 call abor1_ftn(record)