From 7bd7937964d6c0ffd9ef4e0c7dc99a67130b14f7 Mon Sep 17 00:00:00 2001 From: Evgeny Mortikov <evgeny.mortikov@gmail.com> Date: Fri, 15 Dec 2023 21:44:22 +0300 Subject: [PATCH] update to include MOSAiC data; array calculations --- .gitignore | 1 + compile2.sh | 1 - drag3.f90 | 145 ++++++++++++++++++++++++++++++++------------ inputdata.f90 | 9 ++- main_drag.f90 | 165 +++++++++++++++++++++++++++++++++++++++++++++----- makefile | 2 +- param.f90 | 48 +++++++-------- prmt.mod | Bin 601 -> 0 bytes 8 files changed, 290 insertions(+), 81 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 compile2.sh delete mode 100644 prmt.mod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b2e5ffe --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/drag.exe diff --git a/compile2.sh b/compile2.sh old mode 100644 new mode 100755 index e1433f8..fac0309 --- a/compile2.sh +++ b/compile2.sh @@ -3,7 +3,6 @@ rm drag_ddt.exe *.o gfortran -c inputdata.f90 gfortran -c param.f90 -gfortran -c prmt.f90 gfortran -c drag3.f90 gfortran -c main_drag.f90 gfortran -o drag_ddt.exe main_drag.o drag3.o inputdata.o param.o diff --git a/drag3.f90 b/drag3.f90 index 039a999..41b5bd3 100644 --- a/drag3.f90 +++ b/drag3.f90 @@ -2,9 +2,10 @@ USE param USE inputdata - - !implicit real (a-h, o-z) + implicit none + + type, public:: data_in real, public:: ws, dt, st, dq, cflh, z0in end type @@ -16,20 +17,80 @@ type, public:: data_par integer, public :: it=10 end type - + + type, public:: data_lutyp + integer, public :: lu_indx=1 + end type contains - - SUBROUTINE surf_flux(in, out, par) + + ! SUBROUTINE surf_fluxMAS(mas1_w, mas1_dt, mas1_st, mas1_dq, out, par1, lu1) + SUBROUTINE surf_fluxMAS(mas1_w, mas1_dt, mas1_st, mas1_dq, mas1_cflh, mas1_z0in, & + masout_zl, masout_ri, masout_re, masout_lnzuzt, masout_zu, masout_ztout,& + masout_rith, masout_cm, masout_ch, masout_ct, masout_ckt,& + par1, lu1,numst) + + real, dimension (numst) :: mas1_w + real, dimension (numst) :: mas1_dt + real, dimension (numst) :: mas1_st + real, dimension (numst) :: mas1_dq + real, dimension (numst) :: mas1_cflh + real, dimension (numst) :: mas1_z0in + + real, dimension (numst) :: masout_zl + real, dimension (numst) :: masout_ri + real, dimension (numst) :: masout_re + real, dimension (numst) :: masout_lnzuzt + real, dimension (numst) :: masout_zu + real, dimension (numst) :: masout_ztout + real, dimension (numst) :: masout_rith + real, dimension (numst) :: masout_cm + real, dimension (numst) :: masout_ch + real, dimension (numst) :: masout_ct + real, dimension (numst) :: masout_ckt + + type (data_in) in + type (data_outdef) out + type (data_par) par1 + type (data_lutyp) lu1 + integer i,numst + + do i=1,numst + in%ws=mas1_w(i) + in%dt=mas1_dt(i) + in%st=mas1_st(i) + in%dq=mas1_dq(i) + in%cflh=mas1_cflh(i) + in%z0in=mas1_z0in(i) + + CALL surf_flux(in, out, par1, lu1) + + masout_zl(i)=out%zl + masout_ri(i)=out%ri + masout_re(i)=out%re + masout_lnzuzt(i)=out%lnzuzt + masout_zu(i)=out%zu + masout_ztout(i)=out%ztout + masout_rith(i)=out%rith + masout_cm(i)=out%cm + masout_ch(i)=out%ch + masout_ct(i)=out%ct + masout_ckt(i)=out%ckt + enddo + END SUBROUTINE surf_fluxMAS + + SUBROUTINE surf_flux(in, out, par, lu) type (data_in) , intent(in) :: in type (data_outdef) out - type (data_par) par + type (data_par) par + type (data_lutyp) lu real ws, dt, st, dq, cflh, z0in integer it + integer lu_indx real zl, ri, re, lnzuzt, zu, ztin, ri_th, cm, ch, ct, ckt - real z0, d3, d0max, u1, a1, y1, cimin, h1, ap0, f, a2, c1, u2, h0, u3, x7, x8, an1, an2, d0, d00, zt, h00, ft0, an4, an5 - real al, al2, an, g, t1, r6, q4, t4, u, g0, r1, f0, f4, a0, am, o, dd, x1, y0, x0, z3, y10, a2ch, x10, p1, p0, h, d1, f1 + real z0, d3, d0max, u1, a1, y1, cimin, f, c1, u2, h0, u3, x7, d0, d00, zt, h00, ft0, an4, an5 + real al, t1, r6, q4, t4, u, r1, f0, f4, am, o, dd, x1, y0, x0, z3, y10, a2ch, x10, p1, p0, h, d1, f1 real d, c4, c1min, c0, c, b1, an0 integer i, j, m ws=in%ws @@ -46,44 +107,48 @@ q4=dq h=cflh z0=z0in + + AN5=(A6/A0)**4 + D1=(2.0E0*G10-AN5*G4-SQRT((AN5*G4)**2+4.0E0*AN5*G10*(G10-G4)))/(2.0E0*G10**2) + Y10=(1.0E0-G4*D1)**.25E0 + X10=(1.0E0-G10*D1)**.5E0 + P1=2.0E0*ATAN(Y10)+ALOG((Y10-1.0E0)/(Y10+1.0E0)) + P0=ALOG((X10-1.0E0)/(X10+1.0E0)) d3=0.0e0 d0max=2.0e0 - !=data_in%ws - !4=data_in%dt - !4=data_in%dq - !=data_in%cflh - !0=data_in%z0 + if(z0.lt.0.0e0) d0max=8.0e0 if(z0.lt.0.0e0) then -! ......definition z0 of sea surface...... - !call z0sea module (ramil_dasha) - !u1=u - !a1=0.0e0 - !y1=25.0e0 - !c1min=alog(h1/1.0e0)/ap0 - !do 630 i=1,it - !f=a2-2.0e0*alog(u1) - !do 570 j=1,it - !c1=(f+2.0e0*alog(y1))/ap0 - !if(u.le.8.0e0) a1=alog(1.0e0+a3*((y1/u1)**3))/ap0 - !c1=c1-a1 - !c1=amax1(c1,c1min) - !y1=c1 - !570 continue - ! z0=h1*exp(-c1*ap0) - ! z0=amax1(z0,0.000015e0) - ! u2=u*alog(h1/z0)/(alog(h/z0)) - ! u1=u2 - !630 continue - ! j=1 - ! h0=h/z0 - ! u3=u1/c1 - ! else + !> @brief Test - definition z0 of sea surface + !> @details if lu_indx=2.or.lu_indx=3 call z0sea module (Ramil_Dasha) + + u1=u + a1=0.0e0 + y1=25.0e0 + c1min=alog(h1/1.0e0)/ap0 + do 630 i=1,it + f=a2-2.0e0*alog(u1) + do 570 j=1,it + c1=(f+2.0e0*alog(y1))/ap0 + if(u.le.8.0e0) a1=alog(1.0e0+a3*((y1/u1)**3))/ap0 + c1=c1-a1 + c1=amax1(c1,c1min) + y1=c1 + 570 continue + z0=h1*exp(-c1*ap0) + z0=amax1(z0,0.000015e0) + u2=u*alog(h1/z0)/(alog(h/z0)) + u1=u2 + 630 continue + j=1 + h0=h/z0 + u3=u1/c1 + else ! ......parameters from viscosity sublayer...... - ! j=0 - ! h0=h/z0 - ! u3=u*ap0/alog(h0) + j=0 + h0=h/z0 + u3=u*ap0/alog(h0) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! end if x7=u3*z0/an diff --git a/inputdata.f90 b/inputdata.f90 index 8fb6737..3543420 100644 --- a/inputdata.f90 +++ b/inputdata.f90 @@ -1,7 +1,14 @@ module INPUTDATA REAl, DIMENSION (6) :: AR1 REAl, DIMENSION (11) :: AR2 - INTEGER, PARAMETER :: IT =1 + INTEGER, PARAMETER :: TEST=1 ! probably IT before renaming + INTEGER nums,ioer,mk + REAL HFX, MFX, zL, betta + REAL U, T4,c0,c4, T1,H,z0h + REAL ws, deltaT, semisumT, D00, Z0, ZT, deltaQ + REAL R6,R1 + REAL AN5, D1, Y10, X10, P1, P0 + !C*==================================================================== !C* .....DEFENITION OF DRAG AND HEAT EXCHANGE COEFFICIENTS...... = !C* DETAILS OF ALGORITM ARE GIVEN IN: = diff --git a/main_drag.f90 b/main_drag.f90 index 6c809af..6e4faff 100644 --- a/main_drag.f90 +++ b/main_drag.f90 @@ -7,27 +7,164 @@ type (data_in):: data_in1 type (data_outdef) :: data_outdef1 - - + type (data_par) :: data_par1 - - open (1,file='4_ddt.txt') - - do i = 1,1000000 - read (1,*,end=100) data_in1%ws, data_in1%dt - - - CALL surf_flux(data_in1, data_outdef1, data_par1) + type (data_lutyp) :: data_lutyp1 + integer :: numst, i + real :: cflh, z0in + character(len = 50) :: filename_in + character(len = 50) :: filename_out + character(len = 50) :: filename_in2 + + type :: datatype_inMAS1 + real, allocatable :: mas_w(:) ! + real, allocatable :: mas_dt(:) + real, allocatable :: mas_st(:) + real, allocatable :: mas_dq(:) + real, allocatable :: mas_cflh(:) + real, allocatable :: mas_z0in(:) + end type + type(datatype_inMAS1) :: data_inMAS + + !input + ! mas_w - abs(wind velocity) at constant flux layer (cfl) hight (m/s) + ! mas_dt - difference between potential temperature at cfl hight and at surface ( deg. k) + ! mas_st - semi-sum of potential temperature at cfl hight and and at surface ( deg. k) + ! mas_dq - difference between humidity at cfl hight and a surface ( gr/gr ) + ! cflh - - cfl hight ( m ) + ! z0in=0.01 - roughness of surface ( m ); + ! it - number of iterations + ! lu_indx - 1 for land, 2 for sea, 3 for lake + ! test - file input + + type :: datatype_outMAS1 + real, allocatable :: masout_zl(:) + real, allocatable :: masout_ri(:) + real, allocatable :: masout_re(:) + real, allocatable :: masout_lnzuzt(:) + real, allocatable :: masout_zu(:) + real, allocatable :: masout_ztout(:) + real, allocatable :: masout_rith(:) + real, allocatable :: masout_cm(:) + real, allocatable :: masout_ch(:) + real, allocatable :: masout_ct(:) + real, allocatable :: masout_ckt(:) + end type + + type(datatype_outMAS1) :: data_outMAS + + !output + !masout_zl - non-dimensional cfl hight + !masout_ri - richardson number + !masout_re - reynods number + !masout_lnzuzt - ln(zu/zt) + !masout_zu - dynamical roughness zu (m) + !masout_ztout - thermal roughness zt (m) + !masout_rith - critical richardson number + !masout_cm - transfer coefficient for momentum + !masout_ch - transfer coefficient fr heat + !masout_ct - coefficient of turbulence (km) at cfl hight (m**2/s) + !masout_ckt - alft=kt/km ( kt-coefficient of turbulence for heat) + + !> @brief Test - file selection for test + + write(*,*) 'running code' + + if (TEST==1) then + filename_in='MOSAiC.txt' + filename_out='out_MOSAiC.txt' + filename_in2='MOSAiC_zh.txt' + elseif (TEST==2) then + filename_in='Irgason1.txt' + filename_out='out_IRGASON1.txt' + filename_in2='IRGASON_zh.txt' + endif + + open (1, file= filename_in, status ='old') + open (2, file=filename_out) + numst=0 + do WHILE (ioer.eq.0) + read (1,*, iostat=ioer) data_in1%ws, data_in1%dt, data_in1%st, data_in1%dq + numst=numst+1 + enddo + close (1) + numst=numst-1 + + + allocate(data_inMAS%mas_w(numst)) + allocate(data_inMAS%mas_dt(numst)) + allocate(data_inMAS%mas_st(numst)) + allocate(data_inMAS%mas_dq(numst)) + allocate(data_inMAS%mas_cflh(numst)) + allocate(data_inMAS%mas_z0in(numst)) + + + + allocate(data_outMAS%masout_zl(numst)) + allocate(data_outMAS%masout_ri(numst)) + allocate(data_outMAS%masout_re(numst)) + allocate(data_outMAS%masout_lnzuzt(numst)) + allocate(data_outMAS%masout_zu(numst)) + allocate(data_outMAS%masout_ztout(numst)) + allocate(data_outMAS%masout_rith(numst)) + allocate(data_outMAS%masout_cm(numst)) + allocate(data_outMAS%masout_ch(numst)) + allocate(data_outMAS%masout_ct(numst)) + allocate(data_outMAS%masout_ckt(numst)) + + open (11, file=filename_in2, status ='old') + open (1, file= filename_in, status ='old') + read (11, *) cflh, z0in + do i=1,numst + read (1,*) data_in1%ws, data_in1%dt, data_in1%st, data_in1%dq + data_inMAS%mas_w(i)=data_inMAS%mas_w(i)+data_in1%ws + data_inMAS%mas_dt(i)=data_inMAS%mas_dt(i)+data_in1%dt + data_inMAS%mas_st(i)=data_inMAS%mas_st(i)+data_in1%st + data_inMAS%mas_dq(i)=data_inMAS%mas_dq(i)+data_in1%dq + data_inMAS%mas_cflh(i)=cflh + data_inMAS%mas_z0in(i)=z0in + enddo + + + CALL surf_fluxMAS(data_inMAS%mas_w, data_inMAS%mas_dt, data_inMAS%mas_st, data_inMAS%mas_dq,& + data_inMAS%mas_cflh, data_inMAS%mas_z0in,& + data_outMAS%masout_zl, data_outMAS%masout_ri, data_outMAS%masout_re, data_outMAS%masout_lnzuzt,& + data_outMAS%masout_zu,data_outMAS%masout_ztout,data_outMAS%masout_rith,data_outMAS%masout_cm,& + data_outMAS%masout_ch,data_outMAS%masout_ct,data_outMAS%masout_ckt,& + data_par1, data_lutyp1,numst) + + do i=1,numst + write (2,20) data_outMAS%masout_zl(i), data_outMAS%masout_ri(i), data_outMAS%masout_re(i), data_outMAS%masout_lnzuzt(i),& + data_outMAS%masout_zu(i), data_outMAS%masout_ztout(i), data_outMAS%masout_rith(i), data_outMAS%masout_cm(i),& + data_outMAS%masout_ch(i), data_outMAS%masout_ct(i), data_outMAS%masout_ckt(i) + enddo + + + deallocate(data_inMAS%mas_w) + deallocate(data_inMAS%mas_dt) + deallocate(data_inMAS%mas_st) + deallocate(data_inMAS%mas_dq) + deallocate(data_inMAS%mas_cflh) + deallocate(data_inMAS%mas_z0in) - enddo + deallocate(data_outMAS%masout_zl) + deallocate(data_outMAS%masout_ri) + deallocate(data_outMAS%masout_re) + deallocate(data_outMAS%masout_lnzuzt) + deallocate(data_outMAS%masout_zu) + deallocate(data_outMAS%masout_ztout) + deallocate(data_outMAS%masout_rith) + deallocate(data_outMAS%masout_cm) + deallocate(data_outMAS%masout_ch) + deallocate(data_outMAS%masout_ct) + deallocate(data_outMAS%masout_ckt) -100 continue -10 format (4i4,5f7.1,f7.4,f7.1) -20 format (4i4,5f7.1,f7.4,f7.1) + 10 format (f8.4,2x,f8.4) + 20 format (11(f10.4,3x)) stop END PROGRAM \ No newline at end of file diff --git a/makefile b/makefile index 1f03324..ef11984 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ RUN = drag.exe -COMPILER ?= intel +COMPILER ?= gnu FC_KEYS ?= # set compiler diff --git a/param.f90 b/param.f90 index ee8540e..467f4de 100644 --- a/param.f90 +++ b/param.f90 @@ -1,27 +1,27 @@ -module PARAM - IMPLICIT REAL (A-H,O-Z) - real, parameter :: AKA=.40E0 - real, parameter :: AP0=.40E0 - real, parameter :: G=9.81E0 - real, parameter :: A0=1.15E0 - real, parameter :: A6=3.5E0 - real, parameter :: G4=16.0E0 - real, parameter :: G10=16.0E0 - real, parameter :: B4=4.7E0 - real, parameter :: ALFAM=.0144E0 - real, parameter :: BETAM=.111E0 - real, parameter :: AN=.000015E0 - real, parameter :: P4=.71E0 - real, parameter :: H1=10.0E0 - real, parameter :: X8=16.3E0 - real, parameter :: AN1=5.0E0/6.0E0 - real, parameter :: AN2=.45E0 - real, parameter :: AL1=AKA*P4 - real, parameter :: G0=1.2 - real, parameter :: AL2=(.14E0*(30.0E0**AN2))*(P4**.8E0) - real, parameter :: A2=ALOG(H1*(G/ALFAM)) - real, parameter :: A3=BETAM*AN*A2 - real, parameter :: R0=.9E0/B4 +module param + implicit real (a-h,o-z) + real, parameter :: aka=.40e0 + real, parameter :: ap0=.40e0 + real, parameter :: g=9.81e0 + real, parameter :: a0=1.15e0 + real, parameter :: a6=3.5e0 + real, parameter :: g4=16.0e0 + real, parameter :: g10=16.0e0 + real, parameter :: b4=4.7e0 + real, parameter :: alfam=.0144e0 + real, parameter :: betam=.111e0 + real, parameter :: an=.000015e0 + real, parameter :: p4=.71e0 + real, parameter :: h1=10.0e0 + real, parameter :: x8=16.3e0 + real, parameter :: an1=5.0e0/6.0e0 + real, parameter :: an2=.45e0 + real, parameter :: al1=aka*p4 + real, parameter :: g0=1.2 + real, parameter :: al2=(.14e0*(30.0e0**an2))*(p4**.8e0) + real, parameter :: a2=alog(h1*(g/alfam)) + real, parameter :: a3=betam*an*a2 + real, parameter :: r0=.9e0/b4 !C* real, parameter :: AN5=(A6/A0)**4 !C* real, parameter :: D1=(2.0E0*G10-AN5*G4-SQRT((AN5*G4)**2+4.0E0*AN5*G10*(G10-G4)))/(2.0E0*G10**2) !C* real, parameter :: Y10=(1.0E0-G4*D1)**.25E0 diff --git a/prmt.mod b/prmt.mod deleted file mode 100644 index fbc5c106bbef1e8d13147a0421ec45fb0d9c8dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmV-f0;c^RiwFP!000001J#&aZ<{a_hVT6=&Yj_+lWjf%mx#~`tuYZLn|f7cEs>%o zq$0H1{{0TYhNLTO+IC|>#5ut>=i&I{H8<B;UgVL4{o(0#SHfFaAGe1JDEBBl*5$e> zpI}oT_V7~gn@^jN5zDgSf1E@cHbL`)p8&dDQ=sjW@j`)vWi6vTS|ml1!%BXZ*;jd$ z$|8|P?=JH!)(%M*%iA<gi>tfnO9Bj7_sF)&4L0Gnf8n8hjOFCFW#UZU6%jUUk?G=; z)01V{s-`lTO&p-lI|B&BID*?E?9FEIkm1-Ez`$pt3_j4^`nkkmTK-*+BFce(ARz<F zZ%EiE$P7Wgy>3j%M#%X%M}Qn<)qFPq#Pxj<xZ^0HLNS3QbcE*z<18G@;2=Q+Yg;w- zwmNPf?EwhmP3EgS`J<7duWcCDD;XDQCLzl6=>8#F;aho_C(A_66B*xkF`QSxqi^UO z)dv1c%p7R7*_bdx2}g{-dR(xp-P!~UKCxPGr^DEDBS0pGg4=?WZw6pYrNiqej7Y~+ zHvE?3P#HkMr{>pLhw)-UI(RVAuL1=ki~yOKc5(TxYGFb?#5je(+qhmE05PEn1wTRj zFo41thY)@A7Z8hVzPg<hPCdby4*F0S^~&l}7`>0A{RnXS1i(OaJ81@v+K)1D)vk_# zcd<8O;Oi|0gPB(8gh4RKTn3?%iL8}lN`0ZtwS+-i3_1WkM=hq<kX~5T9Zyf}X#2zL nh~8|NV$cipI7K@oU2jJ+ruz)qT)%U)g-w0}!l@Ipo)G{5Fu)>l -- GitLab