144 CHARACTER(LEN=*),
INTENT(IN) :: NAME
151 fvcom_website =
'http://fvcom.smast.umassd.edu, http://codfish.smast.umassd.edu' 152 institution =
'School for Marine Science and Technology' 184 INTEGER,
INTENT(IN) :: vrb
196 Subroutine dbg_init(IPT_BASE,outtofile)
200 integer,
intent(in):: IPT_BASE
201 logical,
intent(in):: outtofile
202 character(LEN=3) :: ch3
203 character(len=100) :: debugname
205 if (outtofile .AND.
msr)
then 206 WRITE(ipt,*)
"========================================================================" 207 WRITE(ipt,*)
"=== All further standard output goes to the user specified log file ====" 208 WRITE(ipt,*)
"=== Any further standard error messages will still print to screen =====" 209 WRITE(ipt,*)
"=== LOG FILE NAME: "//trim(
infofile)
210 WRITE(ipt,*)
"========================================================================" 217 ipt = ipt_base +
myid 218 write(ch3,
'(i3.3)')
myid 219 debugname=trim(
prg_name)//
"_DEBUG."&
220 & // trim(adjustl(ch3)) //
".log" 222 CALL fopen(ipt, trim(debugname) ,
"ofr")
232 character(Len=*) :: ER1
233 CHARACTER(LEN=*),
OPTIONAL :: ER2
234 CHARACTER(LEN=*),
OPTIONAL :: ER3
235 CHARACTER(LEN=*),
OPTIONAL :: ER4
238 write(ipt,*)
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" 239 write(ipt,*) trim(
prg_name)//
" Fatal Error!" 241 IF(
PRESENT(er2))
WRITE(ipt,*) er2
242 IF(
PRESENT(er3))
WRITE(ipt,*) er3
243 IF(
PRESENT(er4))
WRITE(ipt,*) er4
244 write(ipt,*)
"Stopping "//trim(
prg_name)
245 write(ipt,*)
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" 250 Subroutine warning(ER1,ER2,ER3,ER4)
253 character(Len=*) :: ER1
254 CHARACTER(LEN=*),
OPTIONAL :: ER2
255 CHARACTER(LEN=*),
OPTIONAL :: ER3
256 CHARACTER(LEN=*),
OPTIONAL :: ER4
259 write(ipt,*)
"+++++++++++++++++++++++++++++++++++++++++++++++++" 260 write(ipt,*) trim(
prg_name)//
" WARNING!" 262 IF(
PRESENT(er2))
WRITE(ipt,*) er2
263 IF(
PRESENT(er3))
WRITE(ipt,*) er3
264 IF(
PRESENT(er4))
WRITE(ipt,*) er4
265 write(ipt,*) trim(
prg_name)//
" CONTINUEING" 266 write(ipt,*)
"+++++++++++++++++++++++++++++++++++++++++++++++++" 293 REAL(DP) :: SBUF,RBUF
295 REAL(SP),
DIMENSION(:),
INTENT(IN) :: VAR
296 CHARACTER(LEN=*),
OPTIONAL :: MSG
300 IF (
PRESENT(msg))
THEN 301 WRITE(
ipt,*)
"START: SHUTDOWN CHECK: "//msg
303 WRITE(
ipt,*)
"START: SHUTDOWN CHECK: no msg" 308 sbuf = sum(dble(var(1:ubound(var,1))))
313 IF (
PRESENT(msg))
THEN 314 CALL fatal_error(
"SHUTDOWN_CHECK FOUND NON FINITE VALUE:",&
317 CALL fatal_error(
'NON FINITE VALUE (DEPTH?) FOUND',&
318 &
'MODEL HAS BECOME UNSTABLE')
334 REAL(DP) :: SBUF,RBUF
336 REAL(SP),
DIMENSION(:,:),
INTENT(IN) :: VAR
337 CHARACTER(LEN=*),
OPTIONAL :: MSG
341 IF (
PRESENT(msg))
THEN 342 WRITE(
ipt,*)
"START: SHUTDOWN CHECK: "//msg
344 WRITE(
ipt,*)
"START: SHUTDOWN CHECK: no msg" 349 sbuf = sum(sum(dble(var(1:ubound(var,1),:)),1),1)
354 IF (
PRESENT(msg))
THEN 355 CALL fatal_error(
"SHUTDOWN_CHECK FOUND NON FINITE VALUE:",&
358 CALL fatal_error(
'NON FINITE VALUE (DEPTH?) FOUND',&
359 &
'MODEL HAS BECOME UNSTABLE')
377 character(LEN=*),
INTENT(IN) :: proj_ref
383 REAL(SPA),
INTENT(IN) :: LON, LAT
384 character(LEN=*),
INTENT(IN) :: proj_ref
385 REAL(SPA),
intent(out):: X, Y
392 integer,
intent(in) :: nsze
393 REAL(SPA),
INTENT(IN) :: LON(nsze), LAT(nsze)
394 character(LEN=*),
INTENT(IN) :: proj_ref
395 REAL(SPA),
intent(out):: X(nsze), Y(nsze)
403 integer,
intent(in) :: nsze, msze
404 REAL(SPA),
INTENT(IN) :: LON(nsze,msze), LAT(nsze,msze)
405 character(LEN=*),
INTENT(IN) :: proj_ref
406 REAL(SPA),
intent(out):: X(nsze,msze), Y(nsze,msze)
415 REAL(DP),
INTENT(IN) :: LON, LAT
416 character(LEN=*),
INTENT(IN) :: proj_ref
417 REAL(DP),
intent(out):: X, Y
426 integer,
intent(in) :: nsze
427 REAL(DP),
INTENT(IN) :: LON(nsze), LAT(nsze)
428 character(LEN=*),
INTENT(IN) :: proj_ref
429 REAL(DP),
INTENT(OUT) :: X(nsze), Y(nsze)
436 integer,
intent(in) :: nsze, msze
437 REAL(DP),
INTENT(IN) :: LON(nsze,msze), LAT(nsze,msze)
438 character(LEN=*),
INTENT(IN) :: proj_ref
439 REAL(DP),
INTENT(OUT) :: X(nsze,msze), Y(nsze,msze)
450 REAL(SPA),
INTENT(OUT) :: LON, LAT
451 character(LEN=*),
INTENT(IN) :: proj_ref
452 REAL(SPA),
intent(IN):: X, Y
460 integer,
intent(in) :: nsze
461 REAL(SPA),
INTENT(OUT) :: LON(nsze), LAT(nsze)
462 character(LEN=*),
INTENT(IN) :: proj_ref
463 REAL(SPA),
intent(IN):: X(nsze), Y(nsze)
471 integer,
intent(in) :: nsze, msze
472 REAL(SPA),
INTENT(OUT) :: LON(nsze,msze), LAT(nsze,msze)
473 character(LEN=*),
INTENT(IN) :: proj_ref
474 REAL(SPA),
intent(IN):: X(nsze,msze), Y(nsze,msze)
483 REAL(DP),
INTENT(OUT) :: LON, LAT
484 character(LEN=*),
INTENT(IN) :: proj_ref
485 REAL(DP),
intent(IN):: X, Y
494 integer,
intent(in) :: nsze
495 REAL(DP),
INTENT(OUT) :: LON(nsze), LAT(nsze)
496 character(LEN=*),
INTENT(IN) :: proj_ref
497 REAL(DP),
intent(IN):: X(nsze), Y(nsze)
505 integer,
intent(in) :: nsze, msze
506 REAL(DP),
INTENT(OUT) :: LON(nsze,msze), LAT(nsze,msze)
507 character(LEN=*),
INTENT(IN) :: proj_ref
508 REAL(DP),
intent(IN):: X(nsze,msze), Y(nsze,msze)
524 INTEGER,
INTENT(IN) :: i
525 REAL(
spa),
INTENT(IN):: xloc,yloc
526 REAL(
spa),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:)
527 REAL(
spa),
POINTER :: pfield(:)
537 INTEGER,
INTENT(IN) :: i
538 REAL(
dp),
INTENT(IN):: xloc,yloc
539 REAL(
dp),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:)
540 REAL(
dp),
POINTER :: pfield(:)
551 INTEGER,
INTENT(IN) :: i
552 REAL(
spa),
INTENT(IN):: xloc,yloc
553 REAL(
spa),
POINTER,
INTENT(IN) :: field(:)
555 REAL(
spa):: x0c, y0c,f0,fx,fy
574 f0 =
aw0(i,1)*field(n1)+
aw0(i,2)*field(n2)+
aw0(i,3)*field(n3)
575 fx =
awx(i,1)*field(n1)+
awx(i,2)*field(n2)+
awx(i,3)*field(n3)
576 fy =
awy(i,1)*field(n1)+
awy(i,2)*field(n2)+
awy(i,3)*field(n3)
577 fpt = f0 + fx*x0c + fy*y0c
588 INTEGER,
INTENT(IN) :: i
589 REAL(
dp),
INTENT(IN):: xloc,yloc
590 REAL(
dp),
POINTER,
INTENT(IN) :: field(:)
592 REAL(
dp):: x0c, y0c,f0,fx,fy
611 f0 =
aw0(i,1)*field(n1)+
aw0(i,2)*field(n2)+
aw0(i,3)*field(n3)
612 fx =
awx(i,1)*field(n1)+
awx(i,2)*field(n2)+
awx(i,3)*field(n3)
613 fy =
awy(i,1)*field(n1)+
awy(i,2)*field(n2)+
awy(i,3)*field(n3)
614 fpt = f0 + fx*x0c + fy*y0c
628 INTEGER,
INTENT(IN) :: i,lvls
629 REAL(
spa),
INTENT(IN):: xloc,yloc,sigloc
630 REAL(
spa),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:,:)
631 REAL(
spa),
POINTER :: pfield(:,:)
641 INTEGER,
INTENT(IN) :: i,lvls
642 REAL(
dp),
INTENT(IN):: xloc,yloc,sigloc
643 REAL(
dp),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:,:)
644 REAL(
dp),
POINTER :: pfield(:,:)
652 USE all_vars,
only :
aw0,
awx,
awy,
nv,
xc,
yc,kbm2,kbm1,kb,
z1,
zz1,
dz1,
dzz1 655 INTEGER,
INTENT(IN) :: i, lvls
656 REAL(
spa),
INTENT(IN):: xloc,yloc,sigloc
657 REAL(
spa),
POINTER,
INTENT(IN) :: field(:,:)
659 REAL(
spa):: x0c,y0c,f0,fx,fy,f_lower,f_upper, alpha,dsig
660 INTEGER :: n1,n2,n3,k1,k2,k
679 IF(lvls == kbm1)
THEN 682 if(sigloc >=
zz1(i,1))
then 686 elseif(sigloc >
zz1(i,kbm1)) then
688 if(sigloc <
zz1(i,k) .and. sigloc >=
zz1(i,k+1) )
then 691 alpha = (
zz1(i,k)-sigloc)/
dzz1(i,k)
701 ELSE IF(lvls == kb)
THEN 704 if(sigloc >=
z1(i,1))
then 708 elseif(sigloc >
z1(i,kb))
then 710 if(sigloc <
z1(i,k) .and. sigloc >=
z1(i,k+1) )
then 713 alpha = (
z1(i,k)-sigloc)/
dz1(i,k)
724 CALL fatal_error(
"INTERP_PNODAL_3D: Invalid number of levels passed",&
725 &
"(Must be equal to either KB or KBM1")
729 f0 =
aw0(i,1)*field(n1,k1)+
aw0(i,2)*field(n2,k1)+
aw0(i,3)*field(n3,k1)
730 fx =
awx(i,1)*field(n1,k1)+
awx(i,2)*field(n2,k1)+
awx(i,3)*field(n3,k1)
731 fy =
awy(i,1)*field(n1,k1)+
awy(i,2)*field(n2,k1)+
awy(i,3)*field(n3,k1)
732 f_upper = f0 + fx*x0c + fy*y0c
739 f0 =
aw0(i,1)*field(n1,k2)+
aw0(i,2)*field(n2,k2)+
aw0(i,3)*field(n3,k2)
740 fx =
awx(i,1)*field(n1,k2)+
awx(i,2)*field(n2,k2)+
awx(i,3)*field(n3,k2)
741 fy =
awy(i,1)*field(n1,k2)+
awy(i,2)*field(n2,k2)+
awy(i,3)*field(n3,k2)
742 f_lower = f0 + fx*x0c + fy*y0c
744 fpt = (alpha)*f_lower + (1.0_spa-alpha)*f_upper
752 USE all_vars,
only :
aw0,
awx,
awy,
nv,
xc,
yc,kbm2,kbm1,kb,
z1,
zz1,
dz1,
dzz1 755 INTEGER,
INTENT(IN) :: i, lvls
756 REAL(
dp),
INTENT(IN):: xloc,yloc,sigloc
757 REAL(
dp),
POINTER,
INTENT(IN) :: field(:,:)
759 REAL(
dp):: x0c,y0c,f0,fx,fy,f_lower,f_upper, alpha,dsig
760 INTEGER :: n1,n2,n3,k1,k2,k
780 IF(lvls == kbm1)
THEN 783 if(sigloc >=
zz1(i,1))
then 787 elseif(sigloc >
zz1(i,kbm1)) then
789 if(sigloc <
zz1(i,k) .and. sigloc >=
zz1(i,k+1) )
then 792 alpha = (
zz1(i,k)-sigloc)/
dzz1(i,k)
802 ELSE IF(lvls == kb)
THEN 805 if(sigloc >=
z1(i,1))
then 809 elseif(sigloc >
z1(i,kb))
then 811 if(sigloc <
z1(i,k) .and. sigloc >=
z1(i,k+1) )
then 814 alpha = (
z1(i,k)-sigloc)/
dz1(i,k)
825 CALL fatal_error(
"INTERP_PNODAL_3D: Invalid number of levels passed",&
826 &
"(Must be equal to either KB or KBM1")
830 f0 =
aw0(i,1)*field(n1,k1)+
aw0(i,2)*field(n2,k1)+
aw0(i,3)*field(n3,k1)
831 fx =
awx(i,1)*field(n1,k1)+
awx(i,2)*field(n2,k1)+
awx(i,3)*field(n3,k1)
832 fy =
awy(i,1)*field(n1,k1)+
awy(i,2)*field(n2,k1)+
awy(i,3)*field(n3,k1)
833 f_upper = f0 + fx*x0c + fy*y0c
840 f0 =
aw0(i,1)*field(n1,k2)+
aw0(i,2)*field(n2,k2)+
aw0(i,3)*field(n3,k2)
841 fx =
awx(i,1)*field(n1,k2)+
awx(i,2)*field(n2,k2)+
awx(i,3)*field(n3,k2)
842 fy =
awy(i,1)*field(n1,k2)+
awy(i,2)*field(n2,k2)+
awy(i,3)*field(n3,k2)
843 f_lower = f0 + fx*x0c + fy*y0c
845 fpt = (alpha)*f_lower + (1.0_dp-alpha)*f_upper
860 INTEGER,
INTENT(IN) :: i
861 REAL(
spa),
INTENT(IN):: xloc,yloc
862 REAL(
spa),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:)
863 REAL(
spa),
POINTER :: pfield(:)
873 INTEGER,
INTENT(IN) :: i
874 REAL(
dp),
INTENT(IN):: xloc,yloc
875 REAL(
dp),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:)
876 REAL(
dp),
POINTER :: pfield(:)
889 INTEGER,
INTENT(IN) :: i
890 REAL(
spa),
INTENT(IN):: xloc,yloc
891 REAL(
spa),
POINTER,
INTENT(IN) :: field(:)
893 REAL(
spa):: x0c, y0c,f0,fx,fy
911 fx =
a1u(i,1)*field(i)+
a1u(i,2)*field(e1)+
a1u(i,3)*field(e2)+
a1u(i,4)*field(e3)
912 fy =
a2u(i,1)*field(i)+
a2u(i,2)*field(e1)+
a2u(i,3)*field(e2)+
a2u(i,4)*field(e3)
913 fpt = field(i) + fx*x0c + fy*y0c
923 INTEGER,
INTENT(IN) :: i
924 REAL(
dp),
INTENT(IN):: xloc,yloc
925 REAL(
dp),
POINTER,
INTENT(IN) :: field(:)
927 REAL(
dp):: x0c, y0c,f0,fx,fy
946 fx =
a1u(i,1)*field(i)+
a1u(i,2)*field(e1)+
a1u(i,3)*field(e2)+
a1u(i,4)*field(e3)
947 fy =
a2u(i,1)*field(i)+
a2u(i,2)*field(e1)+
a2u(i,3)*field(e2)+
a2u(i,4)*field(e3)
948 fpt = field(i) + fx*x0c + fy*y0c
962 INTEGER,
INTENT(IN) :: i, lvls
963 REAL(
spa),
INTENT(IN):: xloc,yloc,sigloc
964 REAL(
spa),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:,:)
965 REAL(
spa),
POINTER :: pfield(:,:)
975 INTEGER,
INTENT(IN) :: i, lvls
976 REAL(
dp),
INTENT(IN):: xloc,yloc,sigloc
977 REAL(
dp),
ALLOCATABLE,
TARGET,
INTENT(IN) ::field(:,:)
978 REAL(
dp),
POINTER :: pfield(:,:)
988 USE all_vars,
only :
a1u,
a2u,
xc,
yc,
nbe,kbm2,kbm1,kb,
z1,
dz1,
zz1,
dzz1 991 INTEGER,
INTENT(IN) :: i,lvls
992 REAL(
spa),
INTENT(IN):: xloc,yloc,sigloc
993 REAL(
spa),
POINTER,
INTENT(IN) :: field(:,:)
995 REAL(
spa):: x0c, y0c,f0,fx,fy,alpha,f_upper,f_lower
996 INTEGER :: e1,e2,e3,k1,k2,k
1015 IF(lvls == kbm1)
THEN 1020 if(sigloc <
zz1(i,kbm1))
then 1026 if(sigloc <
zz1(i,k) .and. sigloc >=
zz1(i,k+1) )
then 1029 alpha = (
zz1(i,k)-sigloc)/
dzz1(i,k)
1035 ELSE IF(lvls == kb)
THEN 1042 if(sigloc <
z1(i,kb))
then 1048 if(sigloc <
z1(i,k) .and. sigloc >=
z1(i,k+1) )
then 1051 alpha = (
z1(i,k)-sigloc)/
dz1(i,k)
1057 CALL fatal_error(
"INTERP_PZONAL_3D: Invalid number of levels passed",&
1058 &
"(Must be equal to either KB or KBM1")
1062 fx =
a1u(i,1)*field(i,k1)+
a1u(i,2)*field(e1,k1)+
a1u(i,3)*field(e2,k1)+
a1u(i,4)*field(e3,k1)
1063 fy =
a2u(i,1)*field(i,k1)+
a2u(i,2)*field(e1,k1)+
a2u(i,3)*field(e2,k1)+
a2u(i,4)*field(e3,k1)
1064 f_upper = field(i,k1) + fx*x0c + fy*y0c
1070 fx =
a1u(i,1)*field(i,k2)+
a1u(i,2)*field(e1,k2)+
a1u(i,3)*field(e2,k2)+
a1u(i,4)*field(e3,k2)
1071 fy =
a2u(i,1)*field(i,k2)+
a2u(i,2)*field(e1,k2)+
a2u(i,3)*field(e2,k2)+
a2u(i,4)*field(e3,k2)
1072 f_lower = field(i,k2) + fx*x0c + fy*y0c
1074 fpt = (alpha)*f_lower + (1.0-alpha)*f_upper
1083 USE all_vars,
only :
a1u,
a2u,
xc,
yc,
nbe,kbm2,kbm1,kb,
z1,
dz1,
zz1,
dzz1 1086 INTEGER,
INTENT(IN) :: i,lvls
1087 REAL(
dp),
INTENT(IN):: xloc,yloc,sigloc
1088 REAL(
dp),
POINTER,
INTENT(IN) :: field(:,:)
1090 REAL(
dp):: x0c, y0c,f0,fx,fy,alpha,f_upper,f_lower
1091 INTEGER :: e1,e2,e3,k1,k2,k
1112 IF(lvls == kbm1)
THEN 1117 if(sigloc <
zz1(i,kbm1))
then 1123 if(sigloc <
zz1(i,k) .and. sigloc >=
zz1(i,k+1) )
then 1126 alpha = (
zz1(i,k)-sigloc)/
dzz1(i,k)
1132 ELSE IF(lvls == kb)
THEN 1139 if(sigloc <
z1(i,kb))
then 1145 if(sigloc <
z1(i,k) .and. sigloc >=
z1(i,k+1) )
then 1148 alpha = (
z1(i,k)-sigloc)/
dz1(i,k)
1154 CALL fatal_error(
"INTERP_PZONAL_3D: Invalid number of levels passed",&
1155 &
"(Must be equal to either KB or KBM1")
1159 fx =
a1u(i,1)*field(i,k1)+
a1u(i,2)*field(e1,k1)+
a1u(i,3)*field(e2,k1)+
a1u(i,4)*field(e3,k1)
1160 fy =
a2u(i,1)*field(i,k1)+
a2u(i,2)*field(e1,k1)+
a2u(i,3)*field(e2,k1)+
a2u(i,4)*field(e3,k1)
1161 f_upper = field(i,k1) + fx*x0c + fy*y0c
1167 fx =
a1u(i,1)*field(i,k2)+
a1u(i,2)*field(e1,k2)+
a1u(i,3)*field(e2,k2)+
a1u(i,4)*field(e3,k2)
1168 fy =
a2u(i,1)*field(i,k2)+
a2u(i,2)*field(e1,k2)+
a2u(i,3)*field(e2,k2)+
a2u(i,4)*field(e3,k2)
1169 f_lower = field(i,k2) + fx*x0c + fy*y0c
1171 fpt = (alpha)*f_lower + (1.0_dp-alpha)*f_upper
1197 real(
sp),
INTENT(IN) :: xloc,yloc
1198 INTEGER,
INTENT(IN),
OPTIONAL :: guess
1200 IF(
PRESENT(guess))
THEN 1202 IF (eid /= 0)
RETURN 1228 real(
sp),
INTENT(IN) :: xloc,yloc
1231 real(
sp),
dimension(1:nt,1) :: radlist
1232 real(
sp),
dimension(3) :: xtri,ytri
1234 integer :: locij(2), cnt
1244 radlist(1:nt,1) = abs(
xc(1:nt)-xloc) + abs(
yc(1:nt)-yloc)
1247 in:
do while(cnt < 50)
1249 locij = minloc(radlist,radlist>radlast)
1251 if(min_loc == 0)
then 1259 radlast = radlist(min_loc,1)
1282 REAL(
sp),
INTENT(IN) :: xloc,yloc
1283 INTEGER,
INTENT(IN) :: guess
1285 integer i,j,k,iney,ncheck
1286 real(
sp),
dimension(3) :: xlast,ylast,xney,yney
1290 IF (guess == 0)
RETURN 1296 ncheck =
nv(guess,j)
1298 iney =
nbve(ncheck,k)
1314 LOGICAL FUNCTION isintri(X0,Y0,Xt,Yt)
1317 real(
sp),
intent(in) :: x0,y0
1318 real(
sp),
intent(in) :: xt(3),yt(3)
1319 real(
sp) :: f1,f2,f3
1326 if(y0 < minval(yt) .or. y0 > maxval(yt))
then 1330 if(x0 < minval(xt) .or. x0 > maxval(xt))
then 1335 f1 = (y0-yt(1))*(xt(2)-xt(1)) - (x0-xt(1))*(yt(2)-yt(1))
1336 f2 = (y0-yt(3))*(xt(1)-xt(3)) - (x0-xt(3))*(yt(1)-yt(3))
1337 f3 = (y0-yt(2))*(xt(3)-xt(2)) - (x0-xt(2))*(yt(3)-yt(2))
1338 if(f1*f3 >= 0.0_sp .and. f3*f2 >= 0.0_sp)
isintri = .true.
1363 real(
sp),
intent(in) :: x0,y0
1364 integer,
intent(in) :: i
1365 real(
sp) :: xt(3),yt(3)
1366 real(
sp) :: f1,f2,f3
1401 function sameside(p1,p2,a,b)
result(value)
1402 real(
sp),
intent(in) :: p1(2)
1403 real(
sp),
intent(in) :: p2(2)
1404 real(
sp),
intent(in) :: a(2)
1405 real(
sp),
intent(in) :: b(2)
1409 cp1 = (b(1)-a(1))*(p1(2)-a(2)) - (b(2)-a(2))*(p1(1)-a(1))
1410 cp2 = (b(1)-a(1))*(p2(2)-a(2)) - (b(2)-a(2))*(p2(1)-a(1))
1413 if(cp1*cp2 >= 0)
value = .true.
1425 INTEGER,
POINTER :: FOUND(:)
1426 INTEGER,
POINTER :: IDEX(:,:)
1427 INTEGER,
POINTER :: CNT(:)
1428 INTEGER,
POINTER :: ORDER(:)
1436 IF (ubound(found,1) == mt)
THEN 1440 DO WHILE(any(found==-1))
1444 &(
"LOOP COUNT EXCEEDED IN GRID_NEIGHBOR_INDEX")
1448 IF(found(i) == -1)
THEN 1452 IF(found(
nbsn(i,j))>-1.and.found(
nbsn(i,j))<loop )
THEN 1456 idex(i,cnt(i)) =
nbsn(i,j)
1478 ELSEIF (ubound(found,1) == nt)
THEN 1482 DO WHILE(any(found==-1))
1486 &(
"LOOP COUNT EXCEEDED IN GRID_NEIGHBOR_INDEX")
1490 IF(found(i) == -1)
THEN 1494 IF(found(
nbe(i,j))>-1 .and.found(
nbe(i,j))<loop )
THEN 1498 idex(i,cnt(i)) =
nbe(i,j)
1522 CALL fatal_error(
"PASSED INVALID SIZE TO GRID_NEIGHBOR_INDEX ???")
1535 LOGICAL,
INTENT(IN) :: PAR
1536 INTEGER,
INTENT(IN) :: NP,ID
1537 character(len=8) :: chr_np,chr_id
1542 WRITE(
ipt,*)
'!================================================================!' 1543 WRITE(
ipt,*)
' _______ _ _ _______ _______ _______ ______ _____ ' 1544 WRITE(
ipt,*)
' (_______)(_) (_)(_______)(_______)(_______)(_____ \ (_____) ' 1545 WRITE(
ipt,*)
' _____ _ _ _ _ _ _ _ _ _____) ) _ __ _ ' 1546 WRITE(
ipt,*)
' | ___) | | | || | | | | || ||_|| |(_____ ( | |/ /| |' 1547 WRITE(
ipt,*)
' | | \ \ / / | |_____ | |___| || | | | _____) )_| /_| |' 1548 WRITE(
ipt,*)
' |_| \___/ \______) \_____/ |_| |_|(______/(_)\_____/ ' 1549 WRITE(
ipt,*)
' -- Beta Release' 1550 WRITE(
ipt,*)
'!================================================================!' 1552 WRITE(
ipt,*)
'!========DOMAIN DECOMPOSITION USING: METIS 4.0.1 ================!' 1553 WRITE(
ipt,*)
'!======Copyright 1998, Regents of University of Minnesota========!' 1556 WRITE(chr_np,
'(I3.3)') np
1557 WRITE(chr_id,
'(I3.3)') id
1558 WRITE(
ipt,*)
'!================================================================!' 1560 WRITE(
ipt,*)
'! RUNNING IN PARALLEL: '//trim(chr_np)//
' Processors !' 1561 WRITE(
ipt,*)
'! MYID is '//trim(chr_id)//
' !' 1562 WRITE(
ipt,*)
'!================================================================!' 1576 SUBROUTINE fopen(IUNIT,INSTR,IOPT)
1582 INTEGER,
INTENT(IN) :: IUNIT
1583 CHARACTER(LEN=*) :: INSTR
1584 CHARACTER(LEN=3),
INTENT(IN) :: IOPT
1585 CHARACTER(LEN=11) :: FORMSTR
1586 CHARACTER(LEN=7) :: STATSTR
1587 LOGICAL CHECK,FEXIST
1588 CHARACTER(LEN=2) :: cios
1591 IF(iopt(1:1) ==
"c")
THEN 1594 ELSE IF(iopt(1:1) ==
"o")
THEN 1598 CALL fatal_error(
"FIRST LETTER IN FOPEN OPTION STRING MUST BE 'c' OR 'o'")
1601 IF(iopt(2:2) ==
"f")
THEN 1602 formstr =
"formatted" 1603 ELSE IF(iopt(2:2) ==
"u")
THEN 1604 formstr =
"unformatted" 1606 CALL fatal_error(
"ERROR PROCESSING FOPEN ON FILE",instr,
"2ND LETTER IN FOPEN OPTION STRING MUST BE 'f' OR 'u'")
1610 INQUIRE(file=instr,exist=fexist)
1611 IF(.NOT. fexist)
CALL fatal_error(
"FILE "//instr//
" NOT FOUND")
1614 OPEN(iunit,file=instr,status=trim(statstr),form=trim(formstr),iostat=ios)
1617 write(cios,
'(i2.2)') ios
1620 & instr,
"IOSTAT ERROR#"//cios//
"; suggests bad permissions ?")
1622 elseif (ios ==29)
then 1624 & instr,
"IOSTAT ERROR#"//cios//
"; suggests bad directory path ?")
1627 elseif (ios /= 0)
then 1628 Call fatal_error(
"UNABLE TO OPEN THE FILE:",instr,
"IOSTAT ERROR# & 1629 &"//cios//
"; UNNKOWN ERROR ?")
1633 IF(iopt(3:3) ==
"r") rewind(iunit)
1636 &
write(
ipt,*)
"Opend File: ",instr
1640 END SUBROUTINE fopen 1643 INTEGER FUNCTION open_dat(FNAME,UNIT,PATH)
1646 CHARACTER(LEN=*) :: fname
1648 CHARACTER(LEN=*),
OPTIONAL :: path
1650 CHARACTER(LEN=400) :: pathnfile
1653 IF (len_trim(fname) ==0)
return 1655 IF (
PRESENT(path))
THEN 1656 IF (len_trim(path) ==0)
return 1658 pathnfile = trim(path)//trim(fname)
1661 pathnfile = trim(
input_dir)//trim(fname)
1663 Call fopen(unit,trim(pathnfile),
'cfr')
1675 SUBROUTINE get_value(LNUM,NUMCHAR,TEXT_LINE,VARNAME,VARTYPE,LOGVAL,STRINGVAL,&
1676 REALVAL,INTVAL,NVAL)
1681 INTEGER,
INTENT(IN) :: LNUM,NUMCHAR
1682 CHARACTER(LEN=NUMCHAR) :: TEXT_LINE
1683 CHARACTER(LEN=40),
INTENT(OUT) :: VARNAME
1684 CHARACTER(LEN=7),
INTENT(OUT) :: VARTYPE
1685 LOGICAL,
INTENT(OUT) :: LOGVAL
1686 CHARACTER(LEN=80),
INTENT(OUT) :: STRINGVAL(150)
1687 REAL(DP),
INTENT(INOUT) :: REALVAL(150)
1688 INTEGER,
INTENT(INOUT) :: INTVAL(150)
1689 INTEGER,
INTENT(OUT) :: NVAL
1691 CHARACTER(LEN=NUMCHAR) :: VARVAL,TEMP,FRAG(200)
1692 CHARACTER(LEN=80) :: TSTRING
1693 CHARACTER(LEN=3) :: ERRSTRING
1694 CHARACTER(LEN=16) :: NUMCHARS
1695 INTEGER LENGTH,EQLOC,LVARVAL,DOTLOC
1696 INTEGER I,J,LOCEX,NP
1701 numchars =
"0123456789+-Ee. " 1704 length = len_trim(text_line)
1705 WRITE(errstring,
"(I3)") lnum
1706 locex = index(text_line,
"!")
1711 IF(length == 0 .OR. locex==1)
THEN 1721 IF(text_line(i:i) ==
",") text_line(i:i) =
" " 1727 temp = text_line(1:locex-1)
1733 eqloc = index(text_line,
"=")
1736 &
'Could not find correct variable name in the datafile header',&
1737 &
'Header comment lines must start with "!", Data lines must contain "="',&
1738 &
'DATA LINE '//errstring//
': This often occurs if the header variable is missing!')
1747 varname = text_line(1:eqloc-1)
1748 varval = adjustl(text_line(eqloc+1:length))
1749 lvarval = len_trim(varval)
1750 IF(lvarval == 0)
then 1751 CALL warning(
'IN DATA PARAMETER FILE', &
1752 &
'VARIABLE'//varname//
'; LINE'//errstring//
' HAS NO ASSOCIATED VALUE')
1764 IF((varval(1:1) ==
"T" .OR. varval(1:1) ==
"F") .AND. lvarval == 1)
THEN 1766 IF(varval(1:1) ==
"T") logval = .true.
1774 IF(index(numchars,varval(i:i)) == 0) vartype =
"string" 1780 IF(vartype ==
"string")
THEN 1782 stringval(1) = tstring
1786 IF(varval(i:i) /=
" ")
THEN 1787 frag(nval) = trim(frag(nval))//varval(i:i)
1790 IF(onfrag) nval = nval + 1
1795 stringval(i+1) = trim(frag(i))
1804 dotloc = index(varval,
".")
1805 IF(dotloc /= 0)
THEN 1816 IF(varval(i:i) /=
" ")
THEN 1817 frag(np) = trim(frag(np))//varval(i:i)
1820 IF(onfrag) np = np + 1
1830 temp = trim(frag(i))
1831 IF(vartype ==
"float")
THEN 1832 READ(temp,*)realval(i)
1834 READ(temp,*)intval(i)
1843 FUNCTION scan_file(UNIT,VNAME,ISCAL,FSCAL,IVEC,FVEC,CVEC,NSZE,CVAL,LVAL)
1872 INTEGER,
INTENT(IN) :: unit
1873 CHARACTER(LEN=*) :: vname
1874 INTEGER,
INTENT(INOUT),
OPTIONAL :: iscal,ivec(*)
1875 REAL(
sp),
INTENT(INOUT),
OPTIONAL :: fscal,fvec(*)
1876 CHARACTER(LEN=80),
OPTIONAL :: cval,cvec(*)
1877 LOGICAL,
INTENT(INOUT),
OPTIONAL :: lval
1878 INTEGER,
INTENT(INOUT),
OPTIONAL :: nsze
1882 REAL(
dp) realval(150)
1884 CHARACTER(LEN=40 ) :: varname
1885 CHARACTER(LEN=80 ) :: stringval(150),title
1886 CHARACTER(LEN=400 ) :: inpline
1887 CHARACTER(LEN=800) :: tline
1888 CHARACTER(LEN=7 ) :: vartype, endline
1889 CHARACTER(LEN=20 ),
DIMENSION(200) :: set
1890 INTEGER i,nval,j,nset,nline,nrep,bgn,nd, lel
1891 LOGICAL setyes,allset,check,logval
1901 lel = len_trim(endline)-1
1910 CALL warning(
"Read 200 lines of header with out finding parameters! ")
1915 tline(1:len(tline)) =
' ' 1918 READ(unit,
'(a)',end=20) inpline
1919 tline = trim(inpline)
1924 i = len_trim(inpline)
1927 IF( inpline(i-lel:i) == trim(endline))
THEN 1930 READ(unit,
'(a)',end=20) inpline
1932 bgn = len_trim(tline)+1
1933 nd = bgn +len_trim(inpline)
1935 tline(bgn:nd) = trim(inpline)
1947 DO i=2,len_trim(tline)
1948 IF( tline(i-lel:i) == endline) tline(i-lel:i) =
' ' 1954 CALL get_value(nline,len_trim(tline),adjustl(tline),varname,vartype,logval,&
1955 stringval,realval,intval,nval)
1959 IF(trim(varname) == trim(vname))
THEN 1961 IF(
PRESENT(iscal))
THEN 1962 IF(vartype ==
'integer')
THEN 1969 ELSE IF(
PRESENT(fscal))
THEN 1970 IF(vartype ==
'float')
THEN 1977 ELSE IF(
PRESENT(cval))
THEN 1978 IF(vartype ==
'string')
THEN 1985 ELSE IF(
PRESENT(lval))
THEN 1986 IF(vartype ==
'logical')
THEN 1993 ELSE IF(
PRESENT(ivec))
THEN 1995 IF(vartype ==
'integer')
THEN 1996 ivec(1:nval) = intval(1:nval)
2007 ELSE IF(
PRESENT(fvec))
THEN 2009 IF(vartype ==
'float')
THEN 2010 fvec(1:nval) = realval(1:nval)
2021 ELSE IF(
PRESENT(cvec))
THEN 2023 IF(vartype ==
'string')
THEN 2024 cvec(1:nval) = stringval(2:nval+1)
2051 character(len=*),
intent(in) :: instring
2052 character,
intent(in) :: delim
2053 character(len=*),
intent(OUT),
ALLOCATABLE :: outstrings(:)
2054 integer :: nlen, i, cnt, prev,next, idx, outlen, lgn
2057 character(len=len(instring)),
ALLOCATABLE :: out_temp(:)
2061 lgn = len_trim(instring)
2062 outlen = len(outstrings)
2066 ALLOCATE(outstrings(1))
2075 if(instring(i:i) == delim) cnt=cnt+1
2078 if(instring(lgn:lgn) /= delim) cnt=cnt+1
2081 ALLOCATE(outstrings(cnt))
2090 idx = index(instring(prev:lgn),delim)
2103 if(outlen .le. next-prev)
Call warning&
2104 (
"Insufficent room to split string!")
2107 outstrings(i) = trim(adjustl(instring(prev:next)))
2109 if(outlen .le. next-prev)
Call warning&
2110 (
"Insufficent room to split string!",
"'"//trim(outstrings(i))//
"'")
2121 IF(delim ==
' ')
THEN 2124 ALLOCATE(out_temp(cnt))
2127 IF(len_trim(outstrings(i)) > 0)
THEN 2129 out_temp(idx) = outstrings(i)
2134 DEALLOCATE(outstrings)
2135 allocate(outstrings(idx))
2145 SUBROUTINE path_split(STRING,PATH,FILE,EXTENSION)
2148 CHARACTER(LEN=*),
INTENT(IN) :: STRING
2149 CHARACTER(LEN=*),
INTENT(OUT):: PATH,FILE,EXTENSION
2151 INTEGER :: IDX, LGN, I
2153 lgn = len_trim(string)
2161 if(string(i:i) ==
'/') idx = i
2166 path = string(1:idx)
2174 IF(string(i:i) ==
'.')
THEN 2175 file = string(idx:(i-1))
2176 extension =string(i:lgn)
2182 IF (len_trim(file) == 0) file = string(idx:lgn)
2190 CHARACTER(len=200) TESTIN
2191 CHARACTER(len=50),
allocatable::testout(:)
2197 testin =
"Hello world, Hello world2, Hello world2, Hello world2, Hello world2" 2198 testin =
"Hello world"//achar(10)//
" Hello world2"//achar(10)//
" Hello world2, Hello world2, Hello world2" 2203 write(ipt,*)
"! TESTING SPLIT STRINGS" 2206 do i=1,
size(testout)
2207 write(ipt,*)
"! ",i,
"'"//trim(testout(i))//
"'" 2215 Real(sp) Function LimLED(a,b,q) Result(lim)
2229 r = abs( (a-b)/(abs(a)+abs(b)+eps) )**q
2230 lim = .5*(1-r)*(a+b)
2234 Real(sp) function
limled1(a,b,alpha) result(lim)
2239 lim = 0.5_sp*(sign(1.,a)+sign(1.,b))*max(min(alpha*abs(a),abs(b)),min(abs(a),alpha*abs(b)))
2243 Real(sp) function
limled2(a,b,alpha) result(lim)
2248 lim = 0.5_sp*(sign(1.,a)+sign(1.,b))*min(0.5_sp*abs(a+b),alpha*abs(a),alpha*abs(b))
2254 CHARACTER(LEN=*),
INTENT(IN) :: item
2255 INTEGER,
INTENT(OUT) :: ierr
2263 DO i = 1,len_trim(item)
2264 IF (item(i:i) ==
".")
THEN 2269 IF( lgt(
"0",item(i:i)) .or. llt(
"9",item(i:i)) )
THEN 2282 REAL(sp) function
read_int(item,ierr)
2284 CHARACTER(LEN=*),
INTENT(IN) :: item
2285 INTEGER,
INTENT(OUT) :: ierr
2291 DO i = 1,len_trim(item)
2293 IF( lgt(
"0",item(i:i)) .or. llt(
"9",item(i:i)) )
THEN 2303 FUNCTION scan_file2(FNAME,VNAME,ISCAL,FSCAL,IVEC,FVEC,CVEC,NSZE,CVAL,LVAL)
2334 CHARACTER(LEN=*) :: fname,vname
2335 INTEGER,
INTENT(INOUT),
OPTIONAL :: iscal,ivec(*)
2336 REAL(
sp),
INTENT(INOUT),
OPTIONAL :: fscal,fvec(*)
2337 CHARACTER(LEN=80),
OPTIONAL :: cval,cvec(*)
2338 LOGICAL,
INTENT(INOUT),
OPTIONAL :: lval
2339 INTEGER,
INTENT(INOUT),
OPTIONAL :: nsze
2344 REAL(
dp) realval(150)
2346 CHARACTER(LEN=40 ) :: varname
2347 CHARACTER(LEN=80 ) :: stringval(150),title
2348 CHARACTER(LEN=80 ) :: inpline
2349 CHARACTER(LEN=400) :: tline
2350 CHARACTER(LEN=7 ) :: vartype
2351 CHARACTER(LEN=20 ),
DIMENSION(200) :: set
2352 INTEGER i,nval,j,nset,nline,nrep
2353 LOGICAL setyes,allset,check,logval
2360 INQUIRE(file=trim(fname),exist=check)
2375 tline(1:len(tline)) =
' ' 2378 READ(
inputf,
'(a)',end=20) inpline
2379 tline(1:80) = inpline(1:80)
2383 i = len_trim(inpline)
2385 IF( inpline(i-1:i) ==
'\\\\')
THEN 2387 READ(
inputf,
'(a)',end=20) inpline
2389 tline( nrep*80 + 1 : nrep*80 +80) = inpline(1:80)
2393 IF(nrep > 4)
CALL fatal_error(
"CANNOT HAVE > 4 LINE CONTINUATIONS")
2397 DO i=2,len_trim(tline)
2398 IF( tline(i-1:i) ==
'\\\\') tline(i-1:i) =
' ' 2403 CALL get_value(nline,len_trim(tline),adjustl(tline),varname,vartype,logval,&
2404 stringval,realval,intval,nval)
2408 IF(trim(varname) == trim(vname))
THEN 2410 IF(
PRESENT(iscal))
THEN 2411 IF(vartype ==
'integer')
THEN 2417 ELSE IF(
PRESENT(fscal))
THEN 2418 IF(vartype ==
'float')
THEN 2424 ELSE IF(
PRESENT(cval))
THEN 2425 IF(vartype ==
'string')
THEN 2431 ELSE IF(
PRESENT(lval))
THEN 2432 IF(vartype ==
'logical')
THEN 2438 ELSE IF(
PRESENT(ivec))
THEN 2440 IF(vartype ==
'integer')
THEN 2441 ivec(1:nval) = intval(1:nval)
2450 ELSE IF(
PRESENT(fvec))
THEN 2452 IF(vartype ==
'float')
THEN 2453 fvec(1:nval) = realval(1:nval)
2462 ELSE IF(
PRESENT(cvec))
THEN 2464 IF(vartype ==
'string')
THEN 2465 cvec(1:nval) = stringval(2:nval+1)
2487 FUNCTION scan_file3(FNAME,VNAME,ISCAL,FSCAL,IVEC,FVEC,CVEC,NSZE,CVAL,LVAL)
2518 CHARACTER(LEN=*) :: fname,vname
2519 INTEGER,
INTENT(INOUT),
OPTIONAL :: iscal,ivec(*)
2520 REAL(
sp),
INTENT(INOUT),
OPTIONAL :: fscal,fvec(*)
2521 CHARACTER(LEN=80),
OPTIONAL :: cval,cvec(*)
2522 LOGICAL,
INTENT(INOUT),
OPTIONAL :: lval
2523 INTEGER,
INTENT(INOUT),
OPTIONAL :: nsze
2528 REAL(
dp) realval(150)
2530 CHARACTER(LEN=40 ) :: varname
2531 CHARACTER(LEN=80 ) :: stringval(150),title
2532 CHARACTER(LEN=80 ) :: inpline
2533 CHARACTER(LEN=400) :: tline
2534 CHARACTER(LEN=7 ) :: vartype
2535 CHARACTER(LEN=20 ),
DIMENSION(200) :: set
2536 INTEGER i,nval,j,nset,nline,nrep
2537 LOGICAL setyes,allset,check,logval
2544 INQUIRE(file=trim(fname),exist=check)
2559 tline(1:len(tline)) =
' ' 2562 READ(
inputf,
'(a)',end=20) inpline
2563 tline(1:80) = inpline(1:80)
2567 i = len_trim(inpline)
2569 IF( inpline(i-1:i) ==
'\\')
THEN 2571 READ(
inputf,
'(a)',end=20) inpline
2573 tline( nrep*80 + 1 : nrep*80 +80) = inpline(1:80)
2577 IF(nrep > 4)
CALL fatal_error(
"CANNOT HAVE > 4 LINE CONTINUATIONS")
2581 DO i=2,len_trim(tline)
2582 IF( tline(i-1:i) ==
'\\') tline(i-1:i) =
' ' 2588 CALL get_value(nline,len_trim(tline),adjustl(tline),varname,vartype,logval,&
2589 stringval,realval,intval,nval)
2593 IF(trim(varname) == trim(vname))
THEN 2595 IF(
PRESENT(iscal))
THEN 2596 IF(vartype ==
'integer')
THEN 2603 ELSE IF(
PRESENT(fscal))
THEN 2604 IF(vartype ==
'float')
THEN 2611 ELSE IF(
PRESENT(cval))
THEN 2612 IF(vartype ==
'string')
THEN 2619 ELSE IF(
PRESENT(lval))
THEN 2620 IF(vartype ==
'logical')
THEN 2627 ELSE IF(
PRESENT(ivec))
THEN 2629 IF(vartype ==
'integer')
THEN 2630 ivec(1:nval) = intval(1:nval)
2640 ELSE IF(
PRESENT(fvec))
THEN 2642 IF(vartype ==
'float')
THEN 2643 fvec(1:nval) = realval(1:nval)
2653 ELSE IF(
PRESENT(cvec))
THEN 2655 IF(vartype ==
'string')
THEN 2656 cvec(1:nval) = stringval(2:nval+1)
integer, dimension(:), allocatable, target ntsn
real(spa) function interp_azonal_2d_flt(xloc, yloc, i, Field)
integer function find_element_containing_robust(xloc, yloc)
real(dp) function interp_anodal_3d_dbl(xloc, yloc, sigloc, lvls, i, Field)
integer function open_dat(FNAME, UNIT, PATH)
subroutine shutdown_check_2d(VAR, MSG)
real(sp) function limled1(a, b, alpha)
integer, parameter dbg_scl
logical function dbg_set(vrb)
integer, parameter dbg_mpi
real(dp) function interp_azonal_3d_dbl(xloc, yloc, sigloc, lvls, i, Field)
subroutine get_value(LNUM, NUMCHAR, TEXT_LINE, VARNAME, VARTYPE, LOGVAL, STRINGVAL, REALVAL, INTVAL, NVAL)
subroutine grid_neighbor_index(FOUND, IDEX, CNT, ORDER)
subroutine meters2degrees_scl_flt(X, Y, proj_ref, LON, LAT)
subroutine test_split_strings
real(sp), dimension(:), allocatable, target yc
subroutine meters2degrees_vec_flt(X, Y, proj_ref, LON, LAT, nsze)
real(sp), dimension(:,:), allocatable, target dzz1
subroutine meters2degrees_vec_dbl(X, Y, proj_ref, LON, LAT, nsze)
subroutine degrees2meters_arr_dbl(LON, LAT, proj_ref, X, Y, nsze, msze)
character(len=80) infofile
real(sp), dimension(:,:), allocatable, target a1u
subroutine dbg_init(IPT_BASE, outtofile)
real(sp), dimension(:,:), allocatable, target awx
integer, pointer nprocs_total
integer, parameter ext_code
real(dp) function interp_anodal_2d_dbl(xloc, yloc, i, Field)
real(spa) function interp_anodal_2d_flt(xloc, yloc, i, Field)
real(spa) function interp_pzonal_3d_flt(xloc, yloc, sigloc, lvls, i, Field)
integer function scan_file(UNIT, VNAME, ISCAL, FSCAL, IVEC, FVEC, CVEC, NSZE, CVAL, LVAL)
subroutine degrees2meters_arr_flt(LON, LAT, proj_ref, X, Y, nsze, msze)
real(sp) function limled(a, b, q)
real(sp), dimension(:,:), allocatable, target aw0
integer, parameter dbg_nbr
integer function find_element_containing(xloc, yloc, GUESS)
integer, parameter sync_tag
real(sp), dimension(:,:), allocatable, target awy
real(sp), dimension(:), allocatable, target vx
character(len=80) institution
real(dp) function interp_azonal_2d_dbl(xloc, yloc, i, Field)
real(dp) function interp_pnodal_2d_dbl(xloc, yloc, i, Field)
integer function scan_file3(FNAME, VNAME, ISCAL, FSCAL, IVEC, FVEC, CVEC, NSZE, CVAL, LVAL)
integer, parameter dbg_vrb
real(sp), dimension(:), allocatable, target vy
integer, dimension(:), allocatable, target ntve
real(sp) function read_int(ITEM, IERR)
subroutine degrees2meters_vec_dbl(LON, LAT, proj_ref, X, Y, nsze)
integer function find_element_containing_quick(xloc, yloc, Guess)
integer, dimension(:,:), allocatable, target nbe
real(spa) function interp_pnodal_2d_flt(xloc, yloc, i, Field)
integer, parameter dbg_sbrio
subroutine warning(ER1, ER2, ER3, ER4)
real(dp) function interp_pzonal_3d_dbl(xloc, yloc, sigloc, lvls, i, Field)
integer, dimension(:,:), allocatable, target nv
real(spa) function interp_pnodal_3d_flt(xloc, yloc, sigloc, lvls, i, Field)
subroutine fopen(IUNIT, INSTR, IOPT)
subroutine degrees2meters_scl_dbl(LON, LAT, proj_ref, X, Y)
real(sp), dimension(:,:), allocatable, target zz1
character(len=80) fvcom_website
character(len=80) fvcom_version
real(dp) function interp_pnodal_3d_dbl(xloc, yloc, sigloc, lvls, i, Field)
integer function scan_file2(FNAME, VNAME, ISCAL, FSCAL, IVEC, FVEC, CVEC, NSZE, CVAL, LVAL)
subroutine initialize_control(NAME)
real(dp) function read_float(ITEM, IERR)
subroutine meters2degrees_arr_dbl(X, Y, proj_ref, LON, LAT, nsze, msze)
subroutine split_string(instring, delim, outstrings)
real(spa) function interp_anodal_3d_flt(xloc, yloc, sigloc, lvls, i, Field)
logical function isintriangle(i, x0, y0)
real(sp), dimension(:,:), allocatable, target a2u
integer, dimension(:,:), allocatable, target nbve
logical function sameside(p1, p2, a, b)
real(dp), parameter deg2rad
subroutine fatal_error(ER1, ER2, ER3, ER4)
real(sp), dimension(:), allocatable, target xc
real(dp) function interp_pzonal_2d_dbl(xloc, yloc, i, Field)
real(sp), dimension(:,:), allocatable, target dz1
logical function have_proj(proj_ref)
real(sp), dimension(:,:), allocatable, target z1
subroutine degrees2meters_vec_flt(LON, LAT, proj_ref, X, Y, nsze)
subroutine shutdown_check_1d(VAR, MSG)
real(spa) function interp_pzonal_2d_flt(xloc, yloc, i, Field)
integer, parameter wait_code
character(len=80) input_dir
subroutine meters2degrees_scl_dbl(X, Y, proj_ref, LON, LAT)
real(sp) function limled2(a, b, alpha)
integer, dimension(:,:), allocatable, target nbsn
integer, parameter dbg_io
integer, parameter dbg_sbr
character(len=80) prg_name
subroutine path_split(STRING, PATH, FILE, EXTENSION)
subroutine meters2degrees_arr_flt(X, Y, proj_ref, LON, LAT, nsze, msze)
logical function isintri(X0, Y0, Xt, Yt)
subroutine degrees2meters_scl_flt(LON, LAT, proj_ref, X, Y)
real(spa) function interp_azonal_3d_flt(xloc, yloc, sigloc, lvls, i, Field)
subroutine write_banner(PAR, NP, ID)
integer, parameter dbg_log
integer, parameter dbg_vec