Changeset dfa7dbd in flex_extract.git for Source/Fortran/rwgrib2.f90
- Timestamp:
- Aug 21, 2019, 7:19:43 PM (5 years ago)
- Branches:
- master, ctbto, dev
- Children:
- 5b5589b
- Parents:
- 8c55c02
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
Source/Fortran/rwgrib2.f90
rba99230 rdfa7dbd 1 MODULE RWGRIB2 2 3 CONTAINS 4 5 SUBROUTINE READLATLON(FILENAME,FELD,MAXL,MAXB,MLEVEL,MPAR) 6 7 USE GRIB_API 8 9 IMPLICIT NONE 10 11 integer :: ifile 12 integer :: iret 1 MODULE RWGRIB2 2 3 CONTAINS 4 5 SUBROUTINE READLATLON(FILENAME,FELD,MAXL,MAXB,MLEVEL,MPAR) 6 7 !! Read a field from GRIB file on lat-lon grid 8 9 USE GRIB_API 10 11 IMPLICIT NONE 12 13 integer :: ifile 14 integer :: iret 13 15 integer :: n,mk,parid,nm 14 16 integer :: i,k … … 68 70 69 71 kloop: do k=1,nm 70 if (parid .eq. mpar(k)) then72 if (parid .eq. mpar(k)) then 71 73 ! l(k)=l(k)+1 72 74 feld(:,:,(k-1)*div+level)=reshape(values,(/maxl,maxb/)) 73 75 ! print*,(k-1)*div+l(k),parid 74 76 exit kloop 75 end if76 end do kloop77 if (k .gt. nm .and. parid .ne. mpar(nm)) then77 end if 78 end do kloop 79 if (k .gt. nm .and. parid .ne. mpar(nm)) then 78 80 write(*,*) k,nm,parid,mpar(nm) 79 81 write(*,*) 'ERROR readlatlon: parameter ',parid,'is not',mpar 80 82 stop 81 end if83 end if 82 84 83 85 ! print*,i 84 86 END DO iloop 85 write(*,*) 'readlatlon: ',i-1,' records read'87 !! write(*,*) 'readlatlon: ',i-1,' records read' 86 88 87 89 DO i=1,n … … 89 91 END DO 90 92 91 deallocate(values)93 if (allocated(values)) deallocate(values) 92 94 deallocate(igrib) 93 95 94 END SUBROUTINE READLATLON 95 96 SUBROUTINE WRITELATLON(iunit,igrib,ogrib,FELD,MAXL,MAXB,MLEVEL,& 97 MLEVELIST,MSTRIDE,MPAR) 98 99 USE GRIB_API 100 101 IMPLICIT NONE 102 103 INTEGER IFIELD,MLEVEL,MNAUF,I,J,K,L,MSTRIDE,IERR,JOUT 104 INTEGER MPAR(MSTRIDE),MAXL,MAXB,LEVMIN,LEVMAX 105 INTEGER IUNIT,igrib,ogrib 106 REAL ZSEC4(MAXL*MAXB) 107 REAL FELD(MAXL,MAXB,MLEVEL) 108 CHARACTER*(*) MLEVELIST 109 INTEGER ILEVEL(MLEVEL),MLINDEX(MLEVEL+1),LLEN 110 111 ! parse MLEVELIST 112 113 LLEN=len(trim(MLEVELIST)) 114 if(index(MLEVELIST,'to') .ne. 0 .or. index(MLEVELIST,'TO') .ne. 0) THEN 115 i=index(MLEVELIST,'/') 116 read(MLEVELIST(1:i-1),*) LEVMIN 117 i=index(MLEVELIST,'/',.true.) 118 read(MLEVELIST(i+1:LLEN),*) LEVMAX 119 l=0 120 do i=LEVMIN,LEVMAX 121 l=l+1 122 ILEVEL(l)=i 123 enddo 124 else 125 l=1 126 MLINDEX(1)=0 127 do i=1,LLEN 128 if(MLEVELIST(i:i) .eq. '/') THEN 129 l=l+1 130 MLINDEX(l)=i 131 endif 132 enddo 133 MLINDEX(l+1)=LLEN+1 134 do i=1,l 135 read(MLEVELIST(MLINDEX(i)+1:MLINDEX(i+1)-1),*) ILEVEL(i) 136 enddo 137 endif 138 139 DO k=1,l 140 call grib_set(igrib,"level",ILEVEL(k)) 141 DO j=1,MSTRIDE 142 call grib_set(igrib,"paramId",MPAR(j)) 143 ! if(MPAR(j) .eq. 87) then 96 END SUBROUTINE READLATLON 97 98 SUBROUTINE WRITELATLON(iunit,igrib,ogrib,FELD,MAXL,MAXB,MLEVEL,& 99 MLEVELIST,MSTRIDE,MPAR) 100 101 !! write a field on lat-lon grid to GRIB file 102 103 USE GRIB_API 104 105 IMPLICIT NONE 106 107 INTEGER IFIELD,MLEVEL,MNAUF,I,J,K,L,MSTRIDE,IERR,JOUT 108 INTEGER MPAR(MSTRIDE),MAXL,MAXB,LEVMIN,LEVMAX 109 INTEGER IUNIT,igrib,ogrib 110 REAL ZSEC4(MAXL*MAXB) 111 REAL FELD(MAXL,MAXB,MLEVEL) 112 CHARACTER*(*) MLEVELIST 113 INTEGER ILEVEL(MLEVEL),MLINDEX(MLEVEL+1),LLEN 114 115 ! parse MLEVELIST 116 117 LLEN=len(trim(MLEVELIST)) 118 if (index(MLEVELIST,'to') .ne. 0 .or. index(MLEVELIST,'TO') .ne. 0) THEN 119 i=index(MLEVELIST,'/') 120 read(MLEVELIST(1:i-1),*) LEVMIN 121 i=index(MLEVELIST,'/',.true.) 122 read(MLEVELIST(i+1:LLEN),*) LEVMAX 123 l=0 124 do i=LEVMIN,LEVMAX 125 l=l+1 126 ILEVEL(l)=i 127 end do 128 else 129 l=1 130 MLINDEX(1)=0 131 do i=1,LLEN 132 if (MLEVELIST(i:i) .eq. '/') THEN 133 l=l+1 134 MLINDEX(l)=i 135 end if 136 end do 137 MLINDEX(l+1)=LLEN+1 138 do i=1,l 139 read(MLEVELIST(MLINDEX(i)+1:MLINDEX(i+1)-1),*) ILEVEL(i) 140 end do 141 end if 142 143 DO k=1,l 144 call grib_set(igrib,"level",ILEVEL(k)) 145 DO j=1,MSTRIDE 146 call grib_set(igrib,"paramId",MPAR(j)) 147 ! if (MPAR(j) .eq. 87) then 144 148 ! call grib_set(igrib,"shortName","etadot") 145 149 ! call grib_set(igrib,"units","Pa,s**-1") 146 ! end if147 ! if (MPAR(j) .eq. 77) then150 ! end if 151 ! if (MPAR(j) .eq. 77) then 148 152 ! call grib_set(igrib,"shortName","etadot") 149 153 ! call grib_set(igrib,"units","s**-1") 150 ! endif 151 if(l .ne. mlevel) then 152 zsec4(1:maxl*maxb)=RESHAPE(FELD(:,:,ILEVEL(k)),(/maxl*maxb/)) 153 else 154 zsec4(1:maxl*maxb)=RESHAPE(FELD(:,:,k),(/maxl*maxb/)) 155 endif 156 call grib_set(igrib,"values",zsec4) 157 158 call grib_write(igrib,iunit) 159 160 ENDDO 161 ENDDO 162 163 164 165 END SUBROUTINE WRITELATLON 166 167 SUBROUTINE READSPECTRAL(FILENAME,CXMN,MNAUF,MLEVEL,& 168 MAXLEV,MPAR,A,B) 169 170 USE GRIB_API 171 172 IMPLICIT NONE 173 174 175 integer :: ifile 154 ! end if 155 if (l .ne. mlevel) then 156 zsec4(1:maxl*maxb)=RESHAPE(FELD(:,:,ILEVEL(k)),(/maxl*maxb/)) 157 else 158 zsec4(1:maxl*maxb)=RESHAPE(FELD(:,:,k),(/maxl*maxb/)) 159 end if 160 call grib_set(igrib,"values",zsec4) 161 162 call grib_write(igrib,iunit) 163 164 END DO 165 END DO 166 167 END SUBROUTINE WRITELATLON 168 169 SUBROUTINE READSPECTRAL(FILENAME,CXMN,MNAUF,MLEVEL,MAXLEV,MPAR,A,B) 170 171 !! read a GRIB file in spherical harmonics 172 173 USE GRIB_API 174 175 IMPLICIT NONE 176 177 integer :: ifile 176 178 integer :: iret 177 179 integer :: n,mk,div,nm,k … … 182 184 REAL :: A(MAXLEV+1),B(MAXLEV+1),pv(2*MAXLEV+2) 183 185 REAL:: CXMN(0:(MNAUF+1)*(MNAUF+2)-1,MLEVEL) 184 integer:: maxl,maxb,mlevel,mstride,mpar(:),mnauf,ioffset,ipar,ilev,l(size(mpar))185 character*(*):: filename186 integer:: maxl,maxb,mlevel,mstride,mpar(:),mnauf,ioffset,ipar,ilev,l(size(mpar)) 187 character*(*):: filename 186 188 187 189 call grib_open_file(ifile, TRIM(FILENAME),'r') … … 226 228 227 229 call grib_get(igrib(i),'paramId',parid) 228 nm=size(mpar)229 div=mlevel/nm230 kloop: do k=1,nm231 if (parid .eq. mpar(k)) then230 nm=size(mpar) 231 div=mlevel/nm 232 kloop: do k=1,nm 233 if (parid .eq. mpar(k)) then 232 234 l(k)=l(k)+1 233 235 cxmn(:,(k-1)*div+l(k))=values(1:(MNAUF+1)*(MNAUF+2)) 234 236 ! print*,(k-1)*div+l(k),parid 235 237 exit kloop 236 end if238 end if 237 239 238 end do kloop239 if (k .gt. nm .and. parid .ne. mpar(nm)) then240 end do kloop 241 if (k .gt. nm .and. parid .ne. mpar(nm)) then 240 242 write(*,*) k,nm,parid,mpar(nm) 241 243 write(*,*) 'ERROR readspectral: parameter ',parid,'is not',mpar 242 244 stop 243 end if245 end if 244 246 245 247 ! print*,i … … 247 249 END DO iloop 248 250 249 write(*,*) 'readspectral: ',i-1,' records read'251 !! write(*,*) 'readspectral: ',i-1,' records read' 250 252 251 253 DO i=1,n … … 256 258 deallocate(igrib) 257 259 258 259 260 A=pv(1:1+MAXLEV) 261 B=pv(2+MAXLEV:2*MAXLEV+2) 262 263 END SUBROUTINE READSPECTRAL 264 265 END MODULE RWGRIB2 260 A=pv(1:1+MAXLEV) 261 B=pv(2+MAXLEV:2*MAXLEV+2) 262 263 END SUBROUTINE READSPECTRAL 264 265 END MODULE RWGRIB2
Note: See TracChangeset
for help on using the changeset viewer.