3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672 USE module_domain, ONLY : domain
3674
3675
3676
3677 integer, intent(in) :: LBi, UBi, LBj, UBj, UBk
3678 integer, intent(in) :: ifield(2,UBk)
3679 integer, intent(out) :: rc
3680
3681 logical, intent(in) :: got(2,UBk)
3682
3683 real (dp), intent(in) :: Focn(LBi:UBi,LBj:UBj,UBk)
3684 real (dp), intent(in) :: Fdat(LBi:UBi,LBj:UBj,UBk)
3685
3686 character (len=*), intent(in) :: FieldName(2,UBk)
3687
3688 TYPE (domain), pointer :: grid
3689 TYPE (ESMF_GridComp) :: model
3690
3691
3692
3693 logical :: got_dat, got_ocn
3694 logical :: DebugWrtU(2) = (/ .false., .false. /)
3695 logical :: DebugWrtv(2) = (/ .false., .false. /)
3696
3697 integer :: i, ic, is, j, ng
3698 integer :: year, month, day, hour, minutes, seconds, sN, SD
3699 integer :: LakeValue, LandValue
3700 integer :: localDE, localDEcount, localPET, PETcount
3701 integer :: IminP, ImaxP, JminP, JmaxP
3702
3703 real (dp) :: Fseconds, TimeInDays, Time_Current
3704
3705 real (dp) :: MyUmax(3), MyUmin(3), Umin(3), Umax(3), Uval
3706 real (dp) :: MyVmax(3), MyVmin(3), Vmin(3), Vmax(3), Vval
3707
3708 real (dp), parameter :: MaxOcnVelocity = 10.0_dp
3709
3710 real (dp), pointer :: ptrU2d(:,:) => null()
3711 real (dp), pointer :: ptrV2d(:,:) => null()
3712
3713 real (KIND(grid%uoce)), pointer :: Uout(:,:) => null()
3714 real (KIND(grid%voce)), pointer :: Vout(:,:) => null()
3715
3716 character (len=22 ) :: Time_CurrentString
3717
3718 character (len=*), parameter :: MyFile = &
3719 & __FILE__//", WRF_ProcessImport_vector"
3720
3721 character (ESMF_MAXSTR) :: cname, ofile, U_string, V_string
3722
3723 TYPE (ESMF_ArraySpec) :: arraySpec2d
3724 TYPE (ESMF_Clock) :: clock
3725 TYPE (ESMF_Field) :: Umerge, Vmerge
3726 TYPE (ESMF_StaggerLoc) :: staggerLoc
3727 TYPE (ESMF_Time) :: CurrentTime
3728 TYPE (ESMF_VM) :: vm
3729
3730
3731
3732
3733
3734 IF (esm_track) THEN
3735 WRITE (trac,'(a,a,i0)') '==> Entering WRF_ProcessImport_vector',&
3736 & ', PET', petrank
3737 FLUSH (trac)
3738 END IF
3739 rc=esmf_success
3740
3741
3742
3743
3744
3745 CALL esmf_gridcompget (model, &
3746 & clock=clock, &
3747 & localpet=localpet, &
3748 & petcount=petcount, &
3749 & vm=vm, &
3750 & name=cname, &
3751 & rc=rc)
3752 IF (esmf_logfounderror(rctocheck=rc, &
3753 & msg=esmf_logerr_passthru, &
3754 & line=__line__, &
3755 & file=myfile)) THEN
3756 RETURN
3757 END IF
3758 ng=grid%grid_id
3759
3760
3761
3762
3763
3764 CALL esmf_gridget (models(iatmos)%grid(ng), &
3765 & localdecount=localdecount, &
3766 & rc=rc)
3767 IF (esmf_logfounderror(rctocheck=rc, &
3768 & msg=esmf_logerr_passthru, &
3769 & line=__line__, &
3770 & file=myfile)) THEN
3771 RETURN
3772 END IF
3773
3774
3775
3776 CALL esmf_clockget (clock, &
3777 & currtime=currenttime, &
3778 & rc=rc)
3779 IF (esmf_logfounderror(rctocheck=rc, &
3780 & msg=esmf_logerr_passthru, &
3781 & line=__line__, &
3782 & file=myfile)) THEN
3783 RETURN
3784 END IF
3785
3786 CALL esmf_timeget (currenttime, &
3787 & yy=year, &
3788 & mm=month, &
3789 & dd=day, &
3790 & h =hour, &
3791 & m =minutes, &
3792 & s =seconds, &
3793 & sn=sn, &
3794 & sd=sd, &
3795 & rc=rc)
3796 IF (esmf_logfounderror(rctocheck=rc, &
3797 & msg=esmf_logerr_passthru, &
3798 & line=__line__, &
3799 & file=myfile)) THEN
3800 RETURN
3801 END IF
3802
3803 CALL esmf_timeget (currenttime, &
3804 & s_r8=time_current, &
3805 & timestring=time_currentstring, &
3806 & rc=rc)
3807 IF (esmf_logfounderror(rctocheck=rc, &
3808 & msg=esmf_logerr_passthru, &
3809 & line=__line__, &
3810 & file=myfile)) THEN
3811 RETURN
3812 END IF
3813 fseconds=real(seconds,dp)+real(sn,dp)/real(sd,dp)
3814 timeindays=time_current/86400.0_dp
3815 is=index(time_currentstring, 'T')
3816 IF (is.gt.0) time_currentstring(is:is)=' '
3817
3818
3819
3820
3821
3822
3823
3824 CALL esmf_arrayspecset (arrayspec2d, &
3825 & typekind=esmf_typekind_r8, &
3826 & rank=2, &
3827 & rc=rc)
3828 IF (esmf_logfounderror(rctocheck=rc, &
3829 & msg=esmf_logerr_passthru, &
3830 & line=__line__, &
3831 & file=myfile)) THEN
3832 RETURN
3833 END IF
3834
3835
3836
3837 got_ocn=got(1,1).and.got(1,2)
3838 got_dat=got(2,1).and.got(2,2)
3839
3840 IF (.not.got_dat.and.got_ocn) THEN
3841 debugwrtu(1)=models(iatmos)%ImportField(ifield(1,1))%debug_write
3842 debugwrtv(1)=models(iatmos)%ImportField(ifield(1,2))%debug_write
3843 u_string=trim(fieldname(1,1))
3844 v_string=trim(fieldname(1,2))
3845 ELSE IF (.not.got_ocn.and.got_dat) THEN
3846 debugwrtu(2)=models(iatmos)%ImportField(ifield(2,1))%debug_write
3847 debugwrtv(2)=models(iatmos)%ImportField(ifield(2,2))%debug_write
3848 u_string=trim(fieldname(2,1))
3849 v_string=trim(fieldname(2,2))
3850 ELSE IF (got_ocn.and.got_dat) THEN
3851 debugwrtu(1)=models(iatmos)%ImportField(ifield(1,1))%debug_write
3852 debugwrtv(1)=models(iatmos)%ImportField(ifield(1,2))%debug_write
3853 debugwrtu(2)=models(iatmos)%ImportField(ifield(2,1))%debug_write
3854 debugwrtv(2)=models(iatmos)%ImportField(ifield(2,2))%debug_write
3855 u_string=trim(fieldname(1,1))//'-'//trim(fieldname(1,2))
3856 v_string=trim(fieldname(2,1))//'-'//trim(fieldname(2,2))
3857 END IF
3858 staggerloc=esmf_staggerloc_center
3859
3860 umerge=esmf_fieldcreate(models(iatmos)%grid(ng), &
3861 & arrayspec2d, &
3862 & staggerloc=staggerloc, &
3863 & name=trim(u_string), &
3864 & rc=rc)
3865 IF (esmf_logfounderror(rctocheck=rc, &
3866 & msg=esmf_logerr_passthru, &
3867 & line=__line__, &
3868 & file=myfile)) THEN
3869 RETURN
3870 END IF
3871
3872 vmerge=esmf_fieldcreate(models(iatmos)%grid(ng), &
3873 & arrayspec2d, &
3874 & staggerloc=staggerloc, &
3875 & name=trim(v_string), &
3876 & rc=rc)
3877 IF (esmf_logfounderror(rctocheck=rc, &
3878 & msg=esmf_logerr_passthru, &
3879 & line=__line__, &
3880 & file=myfile)) THEN
3881 RETURN
3882 END IF
3883
3884
3885
3886 CALL esmf_fieldget (umerge, &
3887 & farrayptr=ptru2d, &
3888 & rc=rc)
3889 IF (esmf_logfounderror(rctocheck=rc, &
3890 & msg=esmf_logerr_passthru, &
3891 & line=__line__, &
3892 & file=myfile)) THEN
3893 RETURN
3894 END IF
3895 ptru2d=missing_dp
3896
3897 CALL esmf_fieldget (vmerge, &
3898 & farrayptr=ptrv2d, &
3899 & rc=rc)
3900 IF (esmf_logfounderror(rctocheck=rc, &
3901 & msg=esmf_logerr_passthru, &
3902 & line=__line__, &
3903 & file=myfile)) THEN
3904 RETURN
3905 END IF
3906 ptrv2d=missing_dp
3907
3908
3909
3910
3911
3912
3913
3914
3916 CASE ('usur', 'dusur', 'usur-dusur', 'dusur-usur')
3917 uout => grid%uoce
3918 CASE DEFAULT
3919 IF (localpet.eq.0) THEN
3920 WRITE (cplout,10) trim(u_string), trim(cinpname)
3921 END IF
3922 rc=esmf_rc_not_found
3923 IF (esmf_logfounderror(rctocheck=rc, &
3924 & msg=esmf_logerr_passthru, &
3925 & line=__line__, &
3926 & file=myfile)) THEN
3927 RETURN
3928 END IF
3929 END SELECT
3930
3932 CASE ('vsur', 'dvsur', 'vsur-dvsur', 'dvsur-vsur')
3933 vout => grid%voce
3934 CASE DEFAULT
3935 IF (localpet.eq.0) THEN
3936 WRITE (cplout,10) trim(v_string), trim(cinpname)
3937 END IF
3938 rc=esmf_rc_not_found
3939 IF (esmf_logfounderror(rctocheck=rc, &
3940 & msg=esmf_logerr_passthru, &
3941 & line=__line__, &
3942 & file=myfile)) THEN
3943 RETURN
3944 END IF
3945 END SELECT
3946
3947
3948
3949 iminp=grid%sp31
3950 imaxp=grid%ep31
3951 jminp=grid%sp33
3952 jmaxp=grid%ep33
3953 IF (grid%ed31.eq.imaxp) THEN
3954 imaxp=imaxp-1
3955 END IF
3956 IF (grid%ed33.eq.jmaxp) THEN
3957 jmaxp=jmaxp-1
3958 END IF
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968 lakevalue=1
3969 landvalue=1
3970
3971
3972
3973
3974
3975
3976
3977 IF (.not.got_dat.and.got_ocn) THEN
3978 myumin= missing_dp
3979 myumax=-missing_dp
3980 myvmin= missing_dp
3981 myvmax=-missing_dp
3982 DO j=jminp,jmaxp
3983 DO i=iminp,imaxp
3984 IF ((int(grid%landmask(i,j)).ne.landvalue).and. &
3985 & (int(grid%lakemask(i,j)).ne.lakevalue)) THEN
3986 uout(i,j)=real(focn(i,j,1), kind(grid%uoce))
3987 vout(i,j)=real(focn(i,j,2), kind(grid%voce))
3988 END IF
3989 ptru2d(i,j)=real(uout(i,j), dp)
3990 ptrv2d(i,j)=real(vout(i,j), dp)
3991 myumin(1)=min(myumin(1),uout(i,j))
3992 myumax(1)=max(myumax(1),uout(i,j))
3993 myvmin(1)=min(myvmin(1),vout(i,j))
3994 myvmax(1)=max(myvmax(1),vout(i,j))
3995 END DO
3996 END DO
3997 ELSE IF (.not.got_ocn.and.got_dat) THEN
3998 myumin= missing_dp
3999 myumax=-missing_dp
4000 myvmin= missing_dp
4001 myvmax=-missing_dp
4002 DO j=jminp,jmaxp
4003 DO i=iminp,imaxp
4004 IF ((int(grid%landmask(i,j)).ne.landvalue).and. &
4005 & (int(grid%lakemask(i,j)).ne.lakevalue)) THEN
4006 uout(i,j)=real(fdat(i,j,1), kind(grid%uoce))
4007 vout(i,j)=real(fdat(i,j,2), kind(grid%voce))
4008 END IF
4009 ptru2d(i,j)=real(uout(i,j), dp)
4010 ptrv2d(i,j)=real(vout(i,j), dp)
4011 myumin(1)=min(myumin(1),uout(i,j))
4012 myumax(1)=max(myumax(1),uout(i,j))
4013 myvmin(1)=min(myvmin(1),vout(i,j))
4014 myvmax(1)=max(myvmax(1),vout(i,j))
4015 END DO
4016 END DO
4017 END IF
4018
4019
4020
4021
4022
4023 IF (got_ocn.and.got_dat) THEN
4024
4025
4026
4027
4028
4029
4030
4031
4032 myumin= missing_dp
4033 myumax=-missing_dp
4034 myvmin= missing_dp
4035 myvmax=-missing_dp
4036 DO j=jminp,jmaxp
4037 DO i=iminp,imaxp
4038 IF ((int(grid%landmask(i,j)).ne.landvalue).and. &
4039 & (int(grid%lakemask(i,j)).ne.lakevalue)) THEN
4040 IF ((abs(fdat(i,j,1)).lt.maxocnvelocity).and. &
4041 & (abs(fdat(i,j,2)).lt.maxocnvelocity)) THEN
4042 myumin(2)=min(myumin(2),fdat(i,j,1))
4043 myumax(2)=max(myumax(2),fdat(i,j,1))
4044 myvmin(2)=min(myvmin(2),fdat(i,j,2))
4045 myvmax(2)=max(myvmax(2),fdat(i,j,2))
4046 uval=fdat(i,j,1)
4047 vval=fdat(i,j,2)
4048 IF ((abs(focn(i,j,1)).lt.maxocnvelocity).and. &
4049 & (abs(focn(i,j,2)).lt.maxocnvelocity)) THEN
4050 myumin(1)=min(myumin(1),focn(i,j,1))
4051 myumax(1)=max(myumax(1),focn(i,j,1))
4052 myvmin(1)=min(myvmin(1),focn(i,j,2))
4053 myvmax(1)=max(myvmax(1),focn(i,j,2))
4054 uval=weights(iatmos)%Cdat(i,j)*uval+ &
4055 & weights(iatmos)%Cesm(i,j)*focn(i,j,1)
4056 vval=weights(iatmos)%Cdat(i,j)*vval+ &
4057 & weights(iatmos)%Cesm(i,j)*focn(i,j,2)
4058 END IF
4059 uout(i,j)=real(uval, kind(grid%uoce))
4060 vout(i,j)=real(vval, kind(grid%voce))
4061 ptru2d(i,j)=real(uval, dp)
4062 ptrv2d(i,j)=real(vval, dp)
4063 myumin(3)=min(myumin(3),uval)
4064 myumax(3)=max(myumax(3),uval)
4065 myvmin(3)=min(myvmin(3),vval)
4066 myvmax(3)=max(myvmax(3),vval)
4067 END IF
4068 END IF
4069 END DO
4070 END DO
4071 END IF
4072
4073
4074
4075 IF (got_ocn.and.got_dat) THEN
4076 ic=3
4077 ELSE
4078 ic=1
4079 END IF
4080
4081 CALL esmf_vmallreduce (vm, &
4082 & senddata=myumin, &
4083 & recvdata=umin, &
4084 & count=ic, &
4085 & reduceflag=esmf_reduce_min, &
4086 & rc=rc)
4087 IF (esmf_logfounderror(rctocheck=rc, &
4088 & msg=esmf_logerr_passthru, &
4089 & line=__line__, &
4090 & file=myfile)) THEN
4091 RETURN
4092 END IF
4093
4094 CALL esmf_vmallreduce (vm, &
4095 & senddata=myumax, &
4096 & recvdata=umax, &
4097 & count=ic, &
4098 & reduceflag=esmf_reduce_max, &
4099 & rc=rc)
4100 IF (esmf_logfounderror(rctocheck=rc, &
4101 & msg=esmf_logerr_passthru, &
4102 & line=__line__, &
4103 & file=myfile)) THEN
4104 RETURN
4105 END IF
4106
4107 CALL esmf_vmallreduce (vm, &
4108 & senddata=myvmin, &
4109 & recvdata=vmin, &
4110 & count=ic, &
4111 & reduceflag=esmf_reduce_min, &
4112 & rc=rc)
4113 IF (esmf_logfounderror(rctocheck=rc, &
4114 & msg=esmf_logerr_passthru, &
4115 & line=__line__, &
4116 & file=myfile)) THEN
4117 RETURN
4118 END IF
4119
4120 CALL esmf_vmallreduce (vm, &
4121 & senddata=myvmax, &
4122 & recvdata=vmax, &
4123 & count=ic, &
4124 & reduceflag=esmf_reduce_max, &
4125 & rc=rc)
4126 IF (esmf_logfounderror(rctocheck=rc, &
4127 & msg=esmf_logerr_passthru, &
4128 & line=__line__, &
4129 & file=myfile)) THEN
4130 RETURN
4131 END IF
4132
4133
4134
4135 IF (got_ocn.and.got_dat) THEN
4136 IF ((debuglevel.ge.0).and.(localpet.eq.0)) THEN
4137 WRITE (cplout,20) trim(u_string), &
4138 & trim(time_currentstring), ng, &
4139 & umin(1), umax(1), &
4140 & umin(2), umax(2), &
4141 & umin(3), umax(3)
4142 WRITE (cplout,20) trim(v_string), &
4143 & trim(time_currentstring), ng, &
4144 & vmin(1), vmax(1), &
4145 & vmin(2), vmax(2), &
4146 & vmin(3), vmax(3)
4147 END IF
4148 ELSE
4149 IF ((debuglevel.ge.0).and.(localpet.eq.0)) THEN
4150 WRITE (cplout,30) umin(1), umax(1)
4151 WRITE (cplout,30) vmin(1), vmax(1)
4152 END IF
4153 END IF
4154
4155
4156
4157 IF ((debuglevel.ge.3).and.any(debugwrtu)) THEN
4158 WRITE (ofile,40) ng, trim(u_string), &
4159 & year, month, day, hour, minutes, seconds
4160 CALL esmf_fieldwrite (umerge, &
4161 & trim(ofile), &
4162 & overwrite=.true., &
4163 & rc=rc)
4164 IF (esmf_logfounderror(rctocheck=rc, &
4165 & msg=esmf_logerr_passthru, &
4166 & line=__line__, &
4167 & file=myfile)) THEN
4168 RETURN
4169 END IF
4170 END IF
4171
4172 IF ((debuglevel.ge.3).and.any(debugwrtv)) THEN
4173 WRITE (ofile,40) ng, trim(v_string), &
4174 & year, month, day, hour, minutes, seconds
4175 CALL esmf_fieldwrite (vmerge, &
4176 & trim(ofile), &
4177 & overwrite=.true., &
4178 & rc=rc)
4179 IF (esmf_logfounderror(rctocheck=rc, &
4180 & msg=esmf_logerr_passthru, &
4181 & line=__line__, &
4182 & file=myfile)) THEN
4183 RETURN
4184 END IF
4185 END IF
4186
4187
4188
4189
4190 IF (associated(ptru2d)) nullify (ptru2d)
4191 IF (associated(ptrv2d)) nullify (ptrv2d)
4192 IF (associated(uout )) nullify (uout)
4193 IF (associated(vout )) nullify (vout)
4194
4195
4196
4197 CALL esmf_fielddestroy (umerge, &
4198 & nogarbage=.false., &
4199 & rc=rc)
4200 IF (esmf_logfounderror(rctocheck=rc, &
4201 & msg=esmf_logerr_passthru, &
4202 & line=__line__, &
4203 & file=myfile)) THEN
4204 RETURN
4205 END IF
4206
4207 CALL esmf_fielddestroy (vmerge, &
4208 & nogarbage=.false., &
4209 & rc=rc)
4210 IF (esmf_logfounderror(rctocheck=rc, &
4211 & msg=esmf_logerr_passthru, &
4212 & line=__line__, &
4213 & file=myfile)) THEN
4214 RETURN
4215 END IF
4216
4217 IF (esm_track) THEN
4218 WRITE (trac,'(a,a,i0)') '<== Exiting WRF_ProcessImport_vector',&
4219 & ', PET', petrank
4220 FLUSH (trac)
4221 END IF
4222 IF (debuglevel.gt.0) FLUSH (cplout)
4223
4224 10 FORMAT (/,5x,'WRF_ProcessImport - ', &
4225 & 'unable to find option to import: ',a, &
4226 & /,25x,'check ''Import(atmos)'' in input script: ',a)
4227 20 FORMAT (1x,' WRF_ProcessImport - ESMF: merging field ''',a,'''', &
4228 & t72,a,2x,'Grid ',i2.2, &
4229 & /,19x,'(OcnMin = ', 1p,e15.8,0p, &
4230 & ' OcnMax = ', 1p,e15.8,0p,')', &
4231 & /,19x,'(DatMin = ', 1p,e15.8,0p, &
4232 & ' DatMax = ', 1p,e15.8,0p,')', &
4233 & /,19x,'(OutMin = ', 1p,e15.8,0p, &
4234 & ' OutMax = ', 1p,e15.8,0p,')')
4235 30 FORMAT (19x, '(OutMin = ', 1p,e15.8,0p, &
4236 & ' OutMax = ', 1p,e15.8,0p,') WRF_ProcessImport')
4237 40 FORMAT ('wrf_',i2.2,'_merged_',a,'_',i4.4,2('-',i2.2),'_', &
4238 & i2.2,2('.',i2.2),'.nc')
4239
4240 RETURN