47 USE yomlun ,ONLY : nulout, nulerr
75 INTEGER(KIND=JPIM) :: mp
76 INTEGER(KIND=JPIM) :: mp0
77 INTEGER(KIND=JPIM) :: mp9
78 INTEGER(KIND=JPIM) :: mp1
79 INTEGER(KIND=JPIM) :: mp5
80 INTEGER(KIND=JPIM) :: igrbcode
81 CHARACTER(LEN=16) :: cname
82 REAL(KIND=JPRB) :: refvali
83 INTEGER(KIND=JPIM) :: nreqin
86 INTEGER(KIND=JPIM) :: itraj
93 INTEGER(KIND=JPIM) :: mp
94 INTEGER(KIND=JPIM) :: mp0
95 INTEGER(KIND=JPIM) :: mp9
96 INTEGER(KIND=JPIM) :: mp1
97 INTEGER(KIND=JPIM) :: mp5
98 INTEGER(KIND=JPIM),
POINTER :: igrbcode(:)
99 CHARACTER(LEN=16) ,
POINTER :: cname(:)
100 REAL(KIND=JPRB) ,
POINTER :: refvali(:)
101 INTEGER(KIND=JPIM),
POINTER :: nreqin(:)
104 INTEGER(KIND=JPIM) :: itraj
111 INTEGER(KIND=JPIM) :: numflds
112 INTEGER(KIND=JPIM) :: ndim
113 INTEGER(KIND=JPIM) :: nlevs
114 INTEGER(KIND=JPIM) :: iptr
115 INTEGER(KIND=JPIM) :: iptr5
116 INTEGER(KIND=JPIM) :: ndim5
119 CHARACTER(LEN=16) :: cgrpname
126 INTEGER(KIND=JPIM) :: igrbcode
128 CHARACTER(LEN=16) :: cname
129 INTEGER(KIND=JPIM) :: ifldnum
130 REAL(KIND=JPRB) :: value
131 INTEGER(KIND=JPIM) :: iptrsurf
133 INTEGER(KIND=JPIM) :: icount
413 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_sb (:,:,:,:)
418 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_sg (:,:,:)
423 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_rr (:,:,:)
429 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_ep (:,:,:,:)
434 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_x2 (:,:,:)
439 REAL(KIND=JPRB),
ALLOCATABLE ::
sp_ci (:,:,:)
446 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vf (:,:,:)
451 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vp (:,:,:)
456 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vv (:,:,:)
461 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vn (:,:,:)
466 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vh (:,:,:)
471 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_va (:,:,:)
476 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vc (:,:,:)
481 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vd (:,:,:)
486 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_ws (:,:,:)
491 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_vx (:,:,:)
497 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_xa (:,:,:,:)
503 REAL(KIND=JPRB),
ALLOCATABLE ::
sd_x2 (:,:,:)
525 SUBROUTINE ini_sflp3(YDSC,YD,KFLDS,KLEVS,LDMTL,CDGRPNAME)
529 INTEGER(KIND=JPIM),
INTENT(IN) :: KFLDS
530 INTEGER(KIND=JPIM),
INTENT(IN) :: KLEVS
531 LOGICAL,
INTENT(IN) :: LDMTL
532 CHARACTER(LEN=*),
INTENT(IN) :: CDGRPNAME
534 INTEGER(KIND=JPIM) :: JFLD, IMAXF
535 REAL(KIND=JPRB) :: ZHOOK_HANDLE
539 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:INI_SFLP3',0,zhook_handle)
546 ydsc%CGRPNAME = cdgrpname
560 ydsc%NDIM = 2*ydsc%NUMFLDS
562 ydsc%NDIM = 3*ydsc%NUMFLDS
565 ydsc%NDIM = ydsc%NUMFLDS
571 ALLOCATE(yd(jfld)%IGRBCODE(klevs))
572 ALLOCATE(yd(jfld)%CNAME(klevs))
573 ALLOCATE(yd(jfld)%REFVALI(klevs))
574 ALLOCATE(yd(jfld)%NREQIN(klevs))
575 yd(jfld)%IGRBCODE(:) = -999
576 yd(jfld)%CNAME(:) =
''
577 yd(jfld)%REFVALI(:) = 0.0_jprb
578 yd(jfld)%NREQIN(:) = -1
581 yd(jfld)%MP0 = yd(jfld)%MP
583 yd(jfld)%MP9 = yd(jfld)%MP0
584 yd(jfld)%MP1 = yd(jfld)%MP0+ydsc%NUMFLDS
586 yd(jfld)%MP9 = yd(jfld)%MP0+ydsc%NUMFLDS
587 yd(jfld)%MP1 = yd(jfld)%MP0+2*ydsc%NUMFLDS
598 DO jfld=kflds+1,imaxf
607 WRITE(nulout,*)
'INITIALIZING 3-D SURFACE FIELD GROUP ', ydsc%CGRPNAME
608 WRITE(nulout,*)
'NUMFLDS=',ydsc%NUMFLDS,
' NLEVS=',ydsc%NLEVS,
' LMTL=',ydsc%LMTL
610 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:INI_SFLP3',1,zhook_handle)
615 SUBROUTINE setup_sflp3(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN)
619 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KGRIB(:)
620 CHARACTER(LEN=16) ,
OPTIONAL,
INTENT(IN) :: CDNAME(:)
621 REAL(KIND=JPRB) ,
OPTIONAL,
INTENT(IN) :: PDEFAULT(:)
622 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KTRAJ
623 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KREQIN(:)
625 INTEGER(KIND=JPIM) :: IPTR,JLEV
626 REAL(KIND=JPRB) :: ZHOOK_HANDLE
630 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SETUP_SFLP3',0,zhook_handle)
632 IF(iptr > ydsc%NUMFLDS)
THEN
633 WRITE(nulerr,*)
'SURFACE FIELDS UNDER-DIMENSINED - GROUP ',&
634 & ydsc%CGRPNAME,ydsc%NUMFLDS,kgrib(1),cdname(1)
635 CALL abor1(
'IPTR > YDSC%NUMFLDS')
637 IF(
PRESENT(kgrib))
THEN
638 yd%IGRBCODE(:) = kgrib(:)
640 IF(
PRESENT(kreqin))
THEN
641 yd%NREQIN(:) = kreqin(:)
643 IF(
PRESENT(cdname))
THEN
644 yd%CNAME(:) = cdname(:)
646 IF(
PRESENT(pdefault))
THEN
647 yd%REFVALI(:) = pdefault
649 IF(
PRESENT(ktraj))
THEN
655 ELSEIF(ktraj == 2)
THEN
657 ELSEIF(ktraj /= 0)
THEN
658 CALL abor1(
'SURFACE_FIELDS:SETUP_SFLP3 - UNKNOWN KTRAJ')
661 ydsc%NDIM5 = ydsc%NDIM5+1
666 WRITE(nulout,
'(1X,A,2I4,1X,A,6I4)') &
667 & ydsc%CGRPNAME(1:6),ydsc%IPTR,jlev,yd%CNAME(jlev),yd%IGRBCODE(jlev),&
668 & yd%MP0,yd%MP9,yd%MP1,yd%ITRAJ,yd%NREQIN(jlev)
670 WRITE(nulout,
'(1X,A,2I4,1X,A,4I4)') &
671 & ydsc%CGRPNAME(1:6),ydsc%IPTR,jlev,yd%CNAME(jlev),yd%IGRBCODE(jlev),&
672 & yd%MP,yd%ITRAJ,yd%NREQIN(jlev)
675 ydsc%IPTR = ydsc%IPTR+1
677 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SETUP_SFLP3',1,zhook_handle)
682 SUBROUTINE ini_sflp2(YDSC,YD,KFLDS,LDMTL,CDGRPNAME)
686 INTEGER(KIND=JPIM),
INTENT(IN) :: KFLDS
687 LOGICAL,
INTENT(IN) :: LDMTL
688 CHARACTER(LEN=*),
INTENT(IN) :: CDGRPNAME
690 INTEGER(KIND=JPIM) :: JFLD, IMAXF
691 REAL(KIND=JPRB) :: ZHOOK_HANDLE
695 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:INI_SFLP2',0,zhook_handle)
702 ydsc%CGRPNAME = cdgrpname
716 ydsc%NDIM = 2*ydsc%NUMFLDS
718 ydsc%NDIM = 3*ydsc%NUMFLDS
721 ydsc%NDIM = ydsc%NUMFLDS
726 yd(jfld)%IGRBCODE = -999
728 yd(jfld)%REFVALI = 0.0_jprb
732 yd(jfld)%MP0 = yd(jfld)%MP
734 yd(jfld)%MP9 = yd(jfld)%MP0
735 yd(jfld)%MP1 = yd(jfld)%MP0+ydsc%NUMFLDS
737 yd(jfld)%MP9 = yd(jfld)%MP0+ydsc%NUMFLDS
738 yd(jfld)%MP1 = yd(jfld)%MP0+2*ydsc%NUMFLDS
749 DO jfld=kflds+1,imaxf
758 WRITE(nulout,*)
'INITIALIZING 2-D SURFACE FIELD GROUP ', ydsc%CGRPNAME
759 WRITE(nulout,*)
'NUMFLDS=',ydsc%NUMFLDS,
' LMTL=',ydsc%LMTL
761 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:INI_SFLP2',1,zhook_handle)
766 SUBROUTINE setup_sflp2(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN)
770 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KGRIB
771 CHARACTER(LEN=16) ,
OPTIONAL,
INTENT(IN) :: CDNAME
772 REAL(KIND=JPRB) ,
OPTIONAL,
INTENT(IN) :: PDEFAULT
773 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KTRAJ
774 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KREQIN
776 INTEGER(KIND=JPIM) :: IPTR
777 REAL(KIND=JPRB) :: ZHOOK_HANDLE
781 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SETUP_SFLP2',0,zhook_handle)
783 IF(iptr > ydsc%NUMFLDS)
THEN
784 WRITE(nulerr,*)
'SURFACE FIELDS UNDER-DIMENSINED - GROUP ',ydsc%CGRPNAME,ydsc%NUMFLDS,kgrib,cdname
785 CALL abor1(
'IPTR > YDSC%NUMFLDS')
787 IF(
PRESENT(kgrib))
THEN
790 IF(
PRESENT(kreqin))
THEN
793 IF(
PRESENT(cdname))
THEN
796 IF(
PRESENT(pdefault))
THEN
797 yd%REFVALI = pdefault
799 IF(
PRESENT(ktraj))
THEN
803 ELSEIF(ktraj == 2)
THEN
805 ELSEIF(ktraj /= 0)
THEN
806 CALL abor1(
'SURFACE_FIELDS:SETUP_SFLP2 - UNKNOWN KTRAJ')
809 ydsc%NDIM5 = ydsc%NDIM5+1
813 WRITE(nulout,
'(1X,A,I4,1X,A,6I4)') &
814 & ydsc%CGRPNAME(1:6),ydsc%IPTR,yd%CNAME,yd%IGRBCODE,&
815 & yd%MP0,yd%MP9,yd%MP1,yd%ITRAJ,yd%NREQIN
817 WRITE(nulout,
'(1X,A,I4,1X,A,4I4)') &
818 & ydsc%CGRPNAME(1:6),ydsc%IPTR,yd%CNAME,yd%IGRBCODE,yd%MP,yd%ITRAJ,yd%NREQIN
821 ydsc%IPTR = ydsc%IPTR+1
822 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SETUP_SFLP2',1,zhook_handle)
827 SUBROUTINE gppoper(CDACT,KBL,PSP_SB,PSP_SG,PSP_RR,PSP_EP,PSP_X2,YDCOM)
829 CHARACTER(LEN=*),
INTENT(IN) :: CDACT
830 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KBL
831 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_SB(:,:,:)
832 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_SG(:,:)
833 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_RR(:,:)
834 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_EP(:,:,:)
835 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_X2(:,:)
839 REAL(KIND=JPRB) :: ZHOOK_HANDLE
843 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPPOPER',0,zhook_handle)
844 IF(
PRESENT(kbl))
THEN
857 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPPOPER',1,zhook_handle)
862 SUBROUTINE gpoper(CDACT,KBL,PSP_SB,PSP_SG,PSP_RR,PSD_VF,PSD_VV,YDCOM,PFIELD,PFIELD2)
864 CHARACTER(LEN=*),
INTENT(IN) :: CDACT
865 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KBL
866 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_SB(:,:,:)
867 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_SG(:,:)
868 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSP_RR(:,:)
869 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSD_VF(:,:)
870 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PSD_VV(:,:)
872 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD(:,:)
873 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD2(:,:)
874 REAL(KIND=JPRB) :: ZHOOK_HANDLE
878 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER',0,zhook_handle)
879 IF(cdact ==
'PUTALLFLDS' .OR. cdact ==
'GETALLFLDS' .OR.&
880 & cdact ==
'TRAJSTORE' .OR. cdact ==
'TRAJSTORECST' .OR. &
881 & cdact ==
'SET0TOTRAJ' .OR. cdact ==
'GETTRAJ' )
THEN
882 IF(.NOT.
PRESENT(pfield))
CALL abor1(
'SURFACE_FIELDS:GPOPER - PFIELD MISSING')
883 IF(
SIZE(pfield,1) <
nproma)
CALL abor1(
'SURFACE_FIELDS:GPOPER - SIZE(PFIELD,1) < NPROMA)')
885 IF(cdact ==
'PUTALLFLDS' .OR. cdact ==
'GETALLFLDS')
THEN
886 IF(
SIZE(pfield,2) <
nprogsurfl)
CALL abor1(
'SURFACE_FIELDS:GPOPER - SIZE(PFIELD,2) < NPROGSURFL)')
888 IF(cdact ==
'GETTRAJ')
THEN
889 IF(.NOT.
PRESENT(pfield2))
CALL abor1(
'SURFACE_FIELDS:GPOPER - PFIELD2 MISSING')
890 IF(
SIZE(pfield2,1) <
nproma)
CALL abor1(
'SURFACE_FIELDS:GPOPER - SIZE(PFIELD2,1) < NPROMA)')
892 IF(
PRESENT(ydcom))
THEN
899 IF(
PRESENT(kbl))
THEN
953 IF(
PRESENT(psp_sb)) &
957 IF(
PRESENT(psp_sg)) &
961 IF(
PRESENT(psp_rr)) &
965 IF(
PRESENT(psd_vf)) &
969 IF(
PRESENT(psd_vv)) &
973 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER',1,zhook_handle)
978 SUBROUTINE gpoper_2(CDACT,PFLD,YDSC,YD,YDCOM,PFIELD,PFIELD2)
980 CHARACTER(LEN=*),
INTENT(IN) :: CDACT
981 REAL(KIND=JPRB),
INTENT(INOUT) :: PFLD(:,:)
985 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD(:,:)
986 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD2(:,:)
988 INTEGER(KIND=JPIM) :: J,IPTR,IPTR2
989 REAL(KIND=JPRB) :: ZZPHY
990 REAL(KIND=JPRB) :: ZHOOK_HANDLE
994 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER_2',0,zhook_handle)
995 IF(cdact ==
'SET9TO0')
THEN
996 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
998 pfld(:,yd(j)%MP9) = pfld(:,yd(j)%MP0)
1000 ELSEIF(cdact ==
'SET1TO0')
THEN
1001 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1003 pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP0)
1005 ELSEIF(cdact ==
'SET1TO9')
THEN
1006 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1008 pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP9)
1010 ELSEIF(cdact ==
'SET1TO9AD')
THEN
1011 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1013 pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP9)+pfld(:,yd(j)%MP1)
1014 pfld(:,yd(j)%MP1) = 0.0_jprb
1016 ELSEIF(cdact ==
'SET0TO1')
THEN
1017 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1019 pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP1)
1021 ELSEIF(cdact ==
'SET0TO1AD')
THEN
1022 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1024 pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+pfld(:,yd(j)%MP0)
1025 pfld(:,yd(j)%MP0) = 0.0_jprb
1027 ELSEIF(cdact ==
'SET9TO1')
THEN
1028 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1030 pfld(:,yd(j)%MP9) = pfld(:,yd(j)%MP1)
1032 ELSEIF(cdact ==
'PHTFILT')
THEN
1033 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1036 pfld(:,yd(j)%MP9) =
repsp1*pfld(:,yd(j)%MP1)+zzphy*pfld(:,yd(j)%MP0)
1037 pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP1)
1039 ELSEIF(cdact ==
'PHTFILTAD')
THEN
1040 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1043 pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+pfld(:,yd(j)%MP0)
1044 pfld(:,yd(j)%MP0) = 0.0_jprb
1045 pfld(:,yd(j)%MP1) = pfld(:,yd(j)%MP1)+
repsp1*pfld(:,yd(j)%MP9)
1046 pfld(:,yd(j)%MP0) = pfld(:,yd(j)%MP0)+zzphy *pfld(:,yd(j)%MP9)
1047 pfld(:,yd(j)%MP9) = 0.0_jprb
1049 ELSEIF(cdact ==
'SET0TOVAL')
THEN
1050 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1052 pfld(:,yd(j)%MP0) = ydcom%VALUE
1054 ELSEIF(cdact ==
'SET9TOVAL')
THEN
1055 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1057 pfld(:,yd(j)%MP9) = ydcom%VALUE
1059 ELSEIF(cdact ==
'SET1TOVAL')
THEN
1060 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_2 : FIELD NOT MULTI-TIME LEVEL')
1062 pfld(:,yd(j)%MP1) = ydcom%VALUE
1064 ELSEIF(cdact ==
'SETALLTOVAL')
THEN
1066 pfld(:,j) = ydcom%VALUE
1068 ELSEIF(cdact ==
'SETDEFAULT')
THEN
1070 IF(yd(j)%NREQIN == -1)
THEN
1071 pfld(:,yd(j)%MP) = yd(j)%REFVALI
1074 ELSEIF(cdact ==
'TRAJSTORE')
THEN
1075 IF(ydsc%NDIM5 > 0 )
THEN
1076 iptr = ydsc%NOFFTRAJ
1078 IF(yd(j)%ITRAJ == 1)
THEN
1080 pfield(:,iptr) = pfld(:,yd(j)%MP)
1084 ELSEIF(cdact ==
'TRAJSTORECST')
THEN
1085 IF(ydsc%NDIM5 > 0 )
THEN
1086 iptr2 = ydsc%NOFFTRAJ_CST
1088 IF(yd(j)%ITRAJ == 2)
THEN
1090 pfield(:,iptr2) = pfld(:,yd(j)%MP)
1094 ELSEIF(cdact ==
'SET0TOTRAJ')
THEN
1095 IF(ydsc%NDIM5 > 0 )
THEN
1096 iptr = ydsc%NOFFTRAJ
1098 IF(yd(j)%ITRAJ == 1)
THEN
1100 pfld(:,yd(j)%MP) = pfield(:,iptr)
1104 ELSEIF(cdact ==
'GETTRAJ')
THEN
1105 IF(ydsc%NDIM5 > 0 )
THEN
1106 iptr = ydsc%NOFFTRAJ
1107 iptr2 = ydsc%NOFFTRAJ_CST
1109 IF(yd(j)%ITRAJ == 1)
THEN
1111 pfld(:,yd(j)%MP5) = pfield(:,iptr)
1112 ELSEIF(yd(j)%ITRAJ == 2)
THEN
1114 pfld(:,yd(j)%MP5) = pfield2(:,iptr2)
1118 ELSEIF(cdact ==
'GETALLFLDS')
THEN
1123 ELSEIF(cdact ==
'PUTALLFLDS')
THEN
1128 ELSEIF(cdact ==
'GETGRIBPOS')
THEN
1130 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1131 IF(yd(j)%IGRBCODE == ydcom%IGRBCODE)
THEN
1132 ydcom%IFLDNUM = ydcom%IPTRSURF
1136 ELSEIF(cdact ==
'GETFIELD')
THEN
1138 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1139 IF(ydcom%IPTRSURF == ydcom%IFLDNUM)
THEN
1140 pfield(:,1) = pfld(:,j)
1144 ELSEIF(cdact ==
'GRIBIN')
THEN
1146 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1147 IF(yd(j)%NREQIN == 1)
THEN
1148 ydcom%ICOUNT = ydcom%ICOUNT+1
1149 ydcom%ICODES(ydcom%ICOUNT) = yd(j)%IGRBCODE
1153 WRITE(nulout,*)
'SURFACE_FIELD:GPPOPER UNKNOWN ACTION - ',cdact
1154 CALL abor1(
'SURFACE_FIELD:GPPOPER - UNKNOWN ACTION')
1156 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER_2',1,zhook_handle)
1161 SUBROUTINE gpoper_3(CDACT,PFLD,YDSC,YD,YDCOM,PFIELD,PFIELD2)
1163 CHARACTER(LEN=*),
INTENT(IN) :: CDACT
1164 REAL(KIND=JPRB),
INTENT(INOUT) :: PFLD(:,:,:)
1168 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD(:,:)
1169 REAL(KIND=JPRB),
OPTIONAL,
INTENT(INOUT) :: PFIELD2(:,:)
1171 INTEGER(KIND=JPIM) :: J,JLEV,IPTR,IPTR2
1172 REAL(KIND=JPRB) :: ZZPHY
1173 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1177 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER_3',0,zhook_handle)
1178 IF(cdact ==
'SET9TO0')
THEN
1179 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1181 pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP0)
1183 ELSEIF(cdact ==
'SET1TO0')
THEN
1184 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1186 pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP0)
1188 ELSEIF(cdact ==
'SET1TO9')
THEN
1189 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1191 pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP9)
1193 ELSEIF(cdact ==
'SET1TO9AD')
THEN
1194 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1196 pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP9)+pfld(:,:,yd(j)%MP1)
1197 pfld(:,:,yd(j)%MP1) = 0.0_jprb
1199 ELSEIF(cdact ==
'SET0TO1')
THEN
1200 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1202 pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP1)
1204 ELSEIF(cdact ==
'SET0TO1AD')
THEN
1205 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1207 pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+pfld(:,:,yd(j)%MP0)
1208 pfld(:,:,yd(j)%MP0) = 0.0_jprb
1210 ELSEIF(cdact ==
'SET9TO1')
THEN
1211 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1213 pfld(:,:,yd(j)%MP9) = pfld(:,:,yd(j)%MP1)
1215 ELSEIF(cdact ==
'PHTFILT')
THEN
1216 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1219 pfld(:,:,yd(j)%MP9) =
repsp1*pfld(:,:,yd(j)%MP1)+zzphy*pfld(:,:,yd(j)%MP0)
1220 pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP1)
1222 ELSEIF(cdact ==
'PHTFILTAD')
THEN
1223 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1226 pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+pfld(:,:,yd(j)%MP0)
1227 pfld(:,:,yd(j)%MP0) = 0.0_jprb
1228 pfld(:,:,yd(j)%MP1) = pfld(:,:,yd(j)%MP1)+
repsp1*pfld(:,:,yd(j)%MP9)
1229 pfld(:,:,yd(j)%MP0) = pfld(:,:,yd(j)%MP0)+zzphy *pfld(:,:,yd(j)%MP9)
1230 pfld(:,:,yd(j)%MP9) = 0.0_jprb
1232 ELSEIF(cdact ==
'SET0TOVAL')
THEN
1233 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1235 pfld(:,:,yd(j)%MP0) = ydcom%VALUE
1237 ELSEIF(cdact ==
'SET9TOVAL')
THEN
1238 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1240 pfld(:,:,yd(j)%MP9) = ydcom%VALUE
1242 ELSEIF(cdact ==
'SET1TOVAL')
THEN
1243 IF( .NOT. ydsc%LMTL)
CALL abor1(
'SURFACE_FIELDS:GPOPER_3 : FIELD NOT MULTI-TIME LEVEL')
1245 pfld(:,:,yd(j)%MP1) = ydcom%VALUE
1247 ELSEIF(cdact ==
'SETALLTOVAL')
THEN
1249 pfld(:,:,j) = ydcom%VALUE
1251 ELSEIF(cdact ==
'SETDEFAULT')
THEN
1253 DO jlev=1,ydsc%NLEVS
1254 IF(yd(j)%NREQIN(jlev) == -1)
THEN
1255 pfld(:,jlev,yd(j)%MP) = yd(j)%REFVALI(jlev)
1259 ELSEIF(cdact ==
'TRAJSTORE')
THEN
1260 IF(ydsc%NDIM5 > 0 )
THEN
1261 iptr = ydsc%NOFFTRAJ
1263 IF(yd(j)%ITRAJ == 1)
THEN
1264 DO jlev=1,ydsc%NLEVS
1266 pfield(:,iptr) = pfld(:,jlev,yd(j)%MP)
1271 ELSEIF(cdact ==
'TRAJSTORECST')
THEN
1272 IF(ydsc%NDIM5 > 0 )
THEN
1273 iptr2 = ydsc%NOFFTRAJ_CST
1275 IF(yd(j)%ITRAJ == 2)
THEN
1276 DO jlev=1,ydsc%NLEVS
1278 pfield(:,iptr2) = pfld(:,jlev,yd(j)%MP)
1283 ELSEIF(cdact ==
'SET0TOTRAJ')
THEN
1284 IF(ydsc%NDIM5 > 0 )
THEN
1285 iptr = ydsc%NOFFTRAJ
1287 IF(yd(j)%ITRAJ == 1)
THEN
1288 DO jlev=1,ydsc%NLEVS
1290 pfld(:,jlev,yd(j)%MP) = pfield(:,iptr)
1295 ELSEIF(cdact ==
'GETTRAJ')
THEN
1296 IF(ydsc%NDIM5 > 0 )
THEN
1297 iptr = ydsc%NOFFTRAJ
1298 iptr2 = ydsc%NOFFTRAJ_CST
1300 IF(yd(j)%ITRAJ == 1)
THEN
1301 DO jlev=1,ydsc%NLEVS
1303 pfld(:,jlev,yd(j)%MP5) = pfield(:,iptr)
1305 ELSEIF(yd(j)%ITRAJ == 2)
THEN
1306 DO jlev=1,ydsc%NLEVS
1308 pfld(:,jlev,yd(j)%MP5) = pfield2(:,iptr2)
1313 ELSEIF(cdact ==
'GETALLFLDS')
THEN
1315 DO jlev=1,ydsc%NLEVS
1317 pfield(:,
nptrsurf) = pfld(:,jlev,j)
1320 ELSEIF(cdact ==
'PUTALLFLDS')
THEN
1322 DO jlev=1,ydsc%NLEVS
1324 pfld(:,jlev,j) = pfield(:,
nptrsurf)
1327 ELSEIF(cdact ==
'GETGRIBPOS')
THEN
1329 DO jlev=1,ydsc%NLEVS
1330 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1331 IF(yd(j)%IGRBCODE(jlev) == ydcom%IGRBCODE)
THEN
1332 ydcom%IFLDNUM = ydcom%IPTRSURF
1337 ELSEIF(cdact ==
'GETFIELD')
THEN
1339 DO jlev=1,ydsc%NLEVS
1340 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1341 IF(ydcom%IPTRSURF == ydcom%IFLDNUM)
THEN
1342 pfield(:,1) = pfld(:,jlev,j)
1347 ELSEIF(cdact ==
'GRIBIN')
THEN
1349 DO jlev=1,ydsc%NLEVS
1350 ydcom%IPTRSURF = ydcom%IPTRSURF+1
1351 IF(yd(j)%NREQIN(jlev) == 1)
THEN
1352 ydcom%ICOUNT = ydcom%ICOUNT+1
1353 ydcom%ICODES(ydcom%ICOUNT) = yd(j)%IGRBCODE(jlev)
1358 WRITE(nulout,*)
'SURFACE_FIELD:GPPOPER UNKNOWN ACTION - ',cdact
1359 CALL abor1(
'SURFACE_FIELD:GPPOPER - UNKNOWN ACTION')
1361 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:GPOPER_3',1,zhook_handle)
1368 INTEGER(KIND=JPIM) :: JBL
1369 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1371 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SURF_STORE',0,zhook_handle)
1376 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SURF_STORE',1,zhook_handle)
1383 INTEGER(KIND=JPIM) :: JBL
1384 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1386 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SURF_RESTORE',0,zhook_handle)
1388 &
CALL abor1(
'SURFACE_FIELDS:SURF_RESTORE - SURF_STORE NOT ALLOCATED')
1393 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:SURF_RESTORE',1,zhook_handle)
1401 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1403 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:ALLO_SURF',0,zhook_handle)
1423 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:ALLO_SURF',1,zhook_handle)
1430 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1432 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:DEALLO_SURF',0,zhook_handle)
1451 IF (
lhook)
CALL dr_hook(
'SURFACE_FIELDS:DEALLO_SURF',1,zhook_handle)
subroutine ini_sflp2(YDSC, YD, KFLDS, LDMTL, CDGRPNAME)
integer(kind=jpim) nofftraj_cst
real(kind=jprb), dimension(:,:,:), allocatable sd_vh
integer(kind=jpim) nundefld
type(type_sfl_vextr2) ysd_x2
type(type_sfl_vclix) ysd_vx
real(kind=jprb), dimension(:,:,:,:), allocatable sp_sb
type(type_sfl_vclia) ysd_va
type(type_surf_gen) ysp_x2d
type(type_surf_gen) ysd_xad
subroutine gpoper(CDACT, KBL, PSP_SB, PSP_SG, PSP_RR, PSD_VF, PSD_VV, YDCOM, PFIELD, PFIELD2)
type(type_sfl_vclin) ysd_vn
type(type_surf_gen) ysd_vvd
type(type_surf_gen) ysd_vfd
type(type_surf_gen) ysd_vxd
integer(kind=jpim) nsurfl
real(kind=jprb), dimension(:,:,:), allocatable sd_vd
type(type_sfl_waves) ysd_ws
real(kind=jprb), dimension(:,:,:), allocatable sp_rr
real(kind=jprb), dimension(:,:,:), allocatable sd_ws
real(kind=jprb), dimension(:,:,:), allocatable sd_vn
real(kind=jprb), dimension(:,:,:), allocatable sp_x2
integer(kind=jpim) nproma
real(kind=jprb), dimension(:,:,:), allocatable sd_vx
type(type_surf_gen) ysd_vcd
type(type_sfl_canri) ysp_ci
type(type_sfl_vclih) ysd_vh
type(type_sfl_resvr) ysp_rr
real(kind=jprb), dimension(:,:,:), allocatable sp_sg
real(kind=jprb), dimension(:,:,:,:), allocatable sp_ep
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine ini_sflp3(YDSC, YD, KFLDS, KLEVS, LDMTL, CDGRPNAME)
type(type_surf_gen) ysd_vhd
real(kind=jprb), dimension(:,:,:), allocatable sp_ci
type(type_sfl_vdiag) ysd_vd
real(kind=jprb), dimension(:,:,:), allocatable sd_vp
type(type_sfl_extrp) ysp_ep
real(kind=jprb), dimension(:,:,:,:), allocatable sd_xa
integer(kind=jpim), parameter jpmaxsflds
integer(kind=jpim) nprogsurfl
type(type_surf_gen) ysd_vdd
subroutine setup_sflp2(YDSC, YD, KGRIB, CDNAME, PDEFAULT, KTRAJ, KREQIN)
subroutine gppoper(CDACT, KBL, PSP_SB, PSP_SG, PSP_RR, PSP_EP, PSP_X2, YDCOM)
type(type_sfl_varsf) ysd_vf
real(kind=jprb), dimension(:,:,:), allocatable surf_store_array
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer(kind=jpim), dimension(jpmaxstraj) nstrajgrib
type(type_surf_gen) ysp_rrd
subroutine setup_sflp3(YDSC, YD, KGRIB, CDNAME, PDEFAULT, KTRAJ, KREQIN)
integer(kind=jpim) ndimsurf
type(type_surf_gen) ysp_sgd
type(type_sfl_xtrp2) ysp_x2
type(type_sfl_vo3abc) ysd_vc
subroutine gpoper_2(CDACT, PFLD, YDSC, YD, YDCOM, PFIELD, PFIELD2)
type(type_sfl_soilb) ysp_sb
type(type_sfl_vextra) ysd_xa
type(type_sfl_snowg) ysp_sg
real(kind=jprb), dimension(:,:,:), allocatable sd_va
integer(kind=jpim) nprogsurf
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
type(type_surf_gen) ysd_vad
type(type_surf_gen) ysp_sbd
type(type_sfl_vclip) ysd_vp
subroutine gpoper_3(CDACT, PFLD, YDSC, YD, YDCOM, PFIELD, PFIELD2)
integer(kind=jpim), parameter jpmaxstraj
type(type_surf_gen) ysp_epd
integer(kind=jpim) ngpblks
type(type_surf_gen) ysd_x2d
real(kind=jprb), dimension(:,:,:), allocatable sd_vv
real(kind=jprb), dimension(:,:,:), allocatable sd_vf
type(type_sfl_vcliv) ysd_vv
real(kind=jprb), dimension(:,:,:), allocatable sd_x2
real(kind=jprb), dimension(:,:,:), allocatable sd_vc
type(type_surf_gen) ysd_vpd
integer(kind=jpim) ndimsurfl
type(type_surf_gen) ysd_wsd
integer(kind=jpim) nofftraj
type(type_surf_gen) ysp_cid
integer(kind=jpim) nptrsurf
type(type_surf_gen) ysd_vnd