SURFEX v7.3
General documentation of Surfex
|
00001 ! ################################################################################# 00002 SUBROUTINE PREP_OCEAN_ASCLLV(HPROGRAM,HSURF,HFILE, & 00003 & KLUOUT,PFIELD) 00004 ! ################################################################################# 00005 ! 00006 !!**** *PREP_OCEAN_ASCLLDV* - prepares oceanic fields from personal data in ascii 00007 !! formed as lat,lon, depth, value 00008 !! 00009 !! PURPOSE 00010 !! ------- 00011 ! 00012 !!** METHOD 00013 !! ------ 00014 !! Read the input file which must be ascii typed, lat,lon,depth, value 00015 !! Version 1: 00016 !! The data must be on the same grid as the pgd and on the same 00017 !! vertical grid as prescribed in oceanvergrid.f90 00018 !! NDEPTH= a definirtn nlev=NOCKMAX (modd_ocean_gridn) 00019 !! 00020 !! Version 2: (not done yet) 00021 !! - dummy or namlist for nb verticals levels 00022 !! - file prescribing the vertical grid 00023 !! 00024 !! REFERENCE 00025 !! --------- 00026 !! 00027 !! 00028 !! AUTHOR 00029 !! ------ 00030 !! P. PEYRILLE 00031 !! 00032 !! MODIFICATIONS 00033 !! ------------- 00034 !! Original 01/2011 00035 !!------------------------------------------------------------------ 00036 ! 00037 USE MODD_PREP, ONLY : CINTERP_TYPE, CINGRID_TYPE 00038 USE MODD_PGD_GRID, ONLY : NL,LLATLONMASK,CGRID,XGRID_PAR,NGRID_PAR 00039 USE MODD_OCEAN_GRID_n , ONLY : NOCKMAX 00040 USE MODD_PGDWORK, ONLY : XSUMVAL, NSIZE 00041 USE MODD_SURF_ATM_n, ONLY : XNATURE, XSEA, XTOWN, XWATER 00042 USE MODD_SEAFLUX_GRID_n , ONLY : NDIM 00043 ! 00044 USE MODI_OPEN_FILE 00045 USE MODI_CLOSE_FILE 00046 USE MODI_GET_LUOUT 00047 USE MODI_GET_LATLONMASK_n 00048 USE MODI_PACK_SAME_RANK 00049 ! 00050 USE MODI_GET_TYPE_DIM_n 00051 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00052 USE PARKIND1 ,ONLY : JPRB 00053 ! 00054 IMPLICIT NONE 00055 ! 00056 !* 0.1 declarations of arguments 00057 ! 00058 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes 00059 CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field 00060 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! file name 00061 INTEGER, INTENT(IN) :: KLUOUT ! output listing logical unit 00062 !CHARACTER(LEN=28), INTENT(IN), OPTIONAL :: HNCVARNAME!var to read 00063 REAL, POINTER, DIMENSION(:,:,:) :: PFIELD ! field to interpolate horizontally 00064 ! 00065 ! 00066 !* 0.2 declarations of local variables 00067 REAL,DIMENSION(:), ALLOCATABLE :: ZLAT 00068 REAL,DIMENSION(:), ALLOCATABLE :: ZLON 00069 REAL,DIMENSION(:), ALLOCATABLE :: ZDEPTH 00070 REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZFIELD 00071 REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIELDR 00072 ! 00073 INTEGER :: IL 00074 INTEGER :: IGLB ! logical unit 00075 INTEGER :: IDIM, ILU 00076 INTEGER :: JI,JK 00077 ! 00078 INTEGER, DIMENSION(:), POINTER :: IMASK ! mask for packing from complete field to nature field 00079 CHARACTER(LEN=6) :: YMASK 00080 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00081 00082 !------------------------------------------------------------------------------------- 00083 IF (LHOOK) CALL DR_HOOK('PREP_OCEAN_ASCLLV',0,ZHOOK_HANDLE) 00084 ! 00085 CINGRID_TYPE='CONF PROJ ' 00086 00087 !* 1. get full dimension of grid 00088 CALL GET_TYPE_DIM_n('FULL ',NL) 00089 !* 2. get Ocean dimension 00090 ! 00091 CALL GET_TYPE_DIM_n('SEA ',IL) 00092 00093 !* 3. get grid informations known over full grid 00094 ! 00095 CALL GET_LATLONMASK_n(LLATLONMASK,CGRID,XGRID_PAR,NGRID_PAR) 00096 ! 00097 !! 00098 00099 WRITE(KLUOUT,*) "==================================== " 00100 WRITE(KLUOUT,*) "Control print in prep_ocean_ascllv " 00101 WRITE(KLUOUT,*) "NL, NOCKMAX", NL,NOCKMAX 00102 00103 ALLOCATE(ZLAT(NL)) 00104 ALLOCATE(ZLON(NL)) 00105 ALLOCATE(ZDEPTH(NOCKMAX)) 00106 00107 ALLOCATE(ZFIELDR(NL,NOCKMAX,4, 1)) 00108 ALLOCATE(ZFIELD(NL,NOCKMAX, 1)) 00109 00110 00111 WRITE(KLUOUT,*) "ZFIELDR",SHAPE(ZFIELDR) 00112 WRITE(KLUOUT,*) "File name used in ocean ascllv", HFILE 00113 00114 WRITE(KLUOUT,*) "USURF= " , HSURF 00115 WRITE(KLUOUT,*) "NL (dim)=", NL 00116 WRITE(KLUOUT,*) "IL (dim)=", IL 00117 ! 00118 !* 2. Reading of field 00119 ! ---------------- 00120 CALL OPEN_FILE(HPROGRAM,IGLB,HFILE,'FORMATTED',HACTION='READ') 00121 ! 00122 00123 DO JI=1,NL 00124 DO JK=1,NOCKMAX 00125 READ(IGLB,*,END=99) ZLAT(JI),ZLON(JI), ZDEPTH(JK), & 00126 ZFIELDR(JI,JK,1,1), ZFIELDR(JI,JK,2,1),ZFIELDR(JI,JK,3,1), & 00127 ZFIELDR(JI,JK,4,1) 00128 END DO 00129 END DO 00130 00131 00132 00133 ! 3. Close the file 00134 99 CALL CLOSE_FILE (HPROGRAM,IGLB) 00135 00136 WRITE(KLUOUT,*) MINVAL(ZFIELDR), MAXVAL(ZFIELDR) 00137 00138 ! 00139 ! Get the correct varaibles 00140 SELECT CASE (HSURF) 00141 CASE('TEMP_OC') 00142 ZFIELD(:,:,1) = ZFIELDR(:,:,1,1) 00143 CASE('SALT_OC') 00144 ZFIELD(:,:,1) = ZFIELDR(:,:,2,1) 00145 CASE('UCUR_OC') 00146 ZFIELD(:,:,1) = ZFIELDR(:,:,3,1) 00147 CASE('VCUR_OC') 00148 ZFIELD(:,:,1) = ZFIELDR(:,:,4,1) 00149 END SELECT 00150 00151 00152 00153 !* 3. Interpolation method 00154 ! -------------------- 00155 ! 00156 CINTERP_TYPE='NONE ' 00157 !CINTERP_TYPE='HORIBL' 00158 ! 00159 00160 YMASK = 'SEA ' 00161 CALL GET_TYPE_DIM_n(YMASK,IDIM) 00162 WRITE(KLUOUT,*) "IDIM (dim sea) =", IDIM 00163 00164 ALLOCATE(PFIELD(1:IDIM,1:SIZE(ZFIELD,2),1:SIZE(ZFIELD,3))) 00165 00166 IF (IDIM/=SIZE(PFIELD,1)) THEN 00167 WRITE(KLUOUT,*)'Wrong dimension of MASK: ',IDIM,SIZE(PFIELD) 00168 CALL ABOR1_SFX('PGD_FIELD: WRONG DIMENSION OF MASK') 00169 ENDIF 00170 00171 ALLOCATE(IMASK(IDIM)) 00172 ILU=0 00173 CALL GET_SURF_MASK_n(YMASK,IDIM,IMASK,ILU,KLUOUT) 00174 DO JK=1,NOCKMAX 00175 CALL PACK_SAME_RANK(IMASK,ZFIELD(:,JK,1),PFIELD(:,JK,1)) 00176 END DO 00177 DEALLOCATE(IMASK) 00178 00179 !* 4. Deallocations 00180 ! ------------- 00181 ! 00182 IF (ALLOCATED(ZLON )) DEALLOCATE(ZLON ) 00183 IF (ALLOCATED(ZLAT )) DEALLOCATE(ZLAT ) 00184 IF (ALLOCATED(ZDEPTH )) DEALLOCATE(ZDEPTH ) 00185 IF (ALLOCATED(ZFIELD )) DEALLOCATE(ZFIELD ) 00186 IF (ALLOCATED(ZFIELDR )) DEALLOCATE(ZFIELDR ) 00187 ! 00188 IF (LHOOK) CALL DR_HOOK('PREP_OCEAN_ASCLLV',1,ZHOOK_HANDLE) 00189 ! 00190 !------------------------------------------------------------------------------------- 00191 END SUBROUTINE PREP_OCEAN_ASCLLV