[1024] | 1 | SUBROUTINE relaxetat0(fichnom) |
---|
| 2 | |
---|
| 3 | use netcdf, only: nf90_get_var |
---|
| 4 | use comuforc_h |
---|
| 5 | use ioipsl_getincom |
---|
| 6 | |
---|
| 7 | IMPLICIT NONE |
---|
| 8 | |
---|
| 9 | !======================================================================= |
---|
| 10 | ! Author: A. Spiga |
---|
| 11 | ! Purpose: Read a simple relaxation field |
---|
| 12 | !======================================================================= |
---|
| 13 | |
---|
| 14 | #include "dimensions.h" |
---|
| 15 | #include "paramet.h" |
---|
| 16 | #include "netcdf.inc" |
---|
| 17 | #include "iniprint.h" |
---|
| 18 | |
---|
| 19 | ! INPUTS |
---|
| 20 | CHARACTER*(*) fichnom |
---|
| 21 | |
---|
| 22 | ! VARIABLES |
---|
| 23 | REAL ucov(iip1, jjp1,llm) |
---|
[1345] | 24 | REAL press(llm) |
---|
[1024] | 25 | INTEGER ierr, nid, nvarid |
---|
| 26 | INTEGER i,j,l,ij |
---|
| 27 | |
---|
| 28 | !! OPEN NETCDF FILE |
---|
| 29 | ierr = NF_OPEN (fichnom, NF_NOWRITE,nid) |
---|
| 30 | IF (ierr.NE.NF_NOERR) THEN |
---|
| 31 | write(lunout,*)'relaxetat0: Pb d''ouverture du fichier' |
---|
| 32 | write(lunout,*)' ierr = ', ierr |
---|
| 33 | CALL ABORT |
---|
| 34 | ENDIF |
---|
| 35 | |
---|
| 36 | !! ALLOCATE RELAXATION FIELD |
---|
| 37 | IF (.NOT.ALLOCATED(uforc)) ALLOCATE(uforc(ip1jmp1,llm)) |
---|
| 38 | |
---|
| 39 | !! READ RELAXATION FIELD |
---|
| 40 | ierr = NF_INQ_VARID (nid, "ucov", nvarid) |
---|
| 41 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 42 | write(lunout,*)"dynetat0: Le champ <ucov> est absent" |
---|
| 43 | CALL abort |
---|
| 44 | ENDIF |
---|
| 45 | ierr = nf90_get_var(nid, nvarid, ucov) |
---|
| 46 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 47 | write(lunout,*)"dynetat0: Lecture echouee pour <ucov>" |
---|
| 48 | CALL abort |
---|
| 49 | ENDIF |
---|
| 50 | |
---|
| 51 | !! TRANSFER TO SHARED VARIABLE IN comuforc_h MODULE |
---|
| 52 | !! TBD --> check the relaxation field's dimensions are OK! |
---|
| 53 | do l=1,llm |
---|
| 54 | do j=1,jjp1 |
---|
| 55 | do i=1,iip1 |
---|
| 56 | ij=(j-1)*iip1+i |
---|
| 57 | uforc(ij,l)=ucov(i,j,l) |
---|
| 58 | enddo |
---|
| 59 | enddo |
---|
| 60 | enddo |
---|
| 61 | |
---|
| 62 | !! READ THE RELAXATION RATE IN SETTINGS |
---|
| 63 | facwind = 1000. |
---|
| 64 | CALL getin('facwind',facwind) |
---|
| 65 | |
---|
[1345] | 66 | !! CALCULATE ATTENUATION FACTOR WITH ALTITUDE |
---|
| 67 | ierr = NF_INQ_VARID (nid, "presnivs", nvarid) |
---|
| 68 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 69 | write(lunout,*)"dynetat0: Le champ <presnivs> est absent" |
---|
| 70 | CALL abort |
---|
| 71 | ENDIF |
---|
| 72 | ierr = nf90_get_var(nid, nvarid, press) |
---|
| 73 | IF (ierr .NE. NF_NOERR) THEN |
---|
| 74 | write(lunout,*)"dynetat0: Lecture echouee pour <press>" |
---|
| 75 | CALL abort |
---|
| 76 | ENDIF |
---|
| 77 | phalf = 1.e5 !! at this pressure, attenua is 0.5 |
---|
| 78 | CALL getin('phalf',phalf) |
---|
| 79 | !! attenua goes from 1 at lowermost levels to 0 at uppermost levels |
---|
| 80 | IF (.NOT.ALLOCATED(attenua)) ALLOCATE(attenua(llm)) |
---|
| 81 | attenua = 0.5*(1.+tanh(log10(press/phalf))) |
---|
| 82 | |
---|
[1024] | 83 | !! END |
---|
| 84 | ierr = NF_CLOSE(nid) |
---|
| 85 | RETURN |
---|
| 86 | END |
---|