📄 echange_zonematch.f90
字号:
!------------------------------------------------------------------------------!! Procedure : echange_zonematch Auteur : E. Radenac! Date : Mai 2003! Fonction Modif : Janvier 2004! Echange des donnees entre deux zones!! Defauts/Limitations/Divers : pour l'instant, une methode de calcul commune ! aux deux zones!------------------------------------------------------------------------------!! -----------------PROVISOIRE-----------------------------------------------!subroutine echange_zonematch(zone1, zone2, typcalc, nfacelim, nbc1, nbc2, ncoupl1, ncoupl2, icycle, typtemps, dtexch)! --------------------------------------------------------------------------subroutine echange_zonematch(zone1, zone2, typcalc, nfacelim, nbc1, nbc2, ncoupl1, ncoupl2, typtemps, dtexch) use OUTPUTuse VARCOMuse DEFZONEuse DEFFIELDuse GEO3Duse TYPHMAKEimplicit none! -- Declaration des entrees --type(st_zone) :: zone1, zone2integer :: typcalc ! type d'interpolationinteger :: nfacelim ! nombre de faces limitesinteger :: nbc1, nbc2 ! indice des conditions aux limites ! concernees dans les zones 1 et 2 integer :: ncoupl1, ncoupl2 ! numero (identite) du raccord ! dans les zones 1 et 2 character :: typtempsreal(krp) :: dtexch ! pas de temps entre ! deux echanges! -----------------PROVISOIRE-----------------------------------------------!integer :: icycle!---------------------------------------------------------------------------! -- Declaration des sorties --! -- Declaration des variables internes --integer :: i, if, ic, if2, ifield, ic1, ic2, iptype(v3d), dimension(nfacelim) :: normale ! normales a l'interfacetype(v3d), dimension(nfacelim) :: vecinter ! vecteurs inter-cellule real(krp), dimension(nfacelim) :: d1, d2 ! distance centre de cellule - centre de face ! (gauche, droite) integer :: typmethodtype(v3d) :: cg1, cg2, cgface ! centres des cellules des zones 1 et 2, et des facesinteger :: typsolver1, typsolver2real(krp) :: dif_enflux ! difference des energies d'interface dans les deuxzonesreal(krp), dimension(nfacelim) :: corcoef ! coefficient de correction de fluxreal(krp) :: rap_f ! rapport des nb de Fourier des 2 zonesreal(krp) :: fcycle1, fcycle2 ! nb de Fourier de cycle ! des deux zonesinteger :: placement ! variable pour le ! placement des correctionsreal(krp) :: part_cor1, part_cor2 ! part de correction a ! apporter, dans les 2 zonesinteger :: typ_cor1, typ_cor2 ! type de correction! -----------------PROVISOIRE-----------------------------------------------!integer :: uf!---------------------------------------------------------------------------! -- Debut de la procedure --! -----------------PROVISOIRE------------------------------------------------! uf = 556!if ((icycle.lt.10)) then! open(unit = uf, file = "t"//trim(adjustl(strof(icycle,3)))//".dat", form = 'formatted')! write(uf, '(a)') 'VARIABLES="X","Y","Z", "T"'!! call output_field(uf, zone1%ust_mesh, zone2%ust_mesh, zone1%field, &! zone2%field,"FIN DU CYCLE PRECEDENT")!endif!-----------------------------------------------------------------------------typ_cor1 = zone1%coupling(ncoupl1)%typ_cortyp_cor2 = zone2%coupling(ncoupl2)%typ_corpart_cor1 = zone1%coupling(ncoupl1)%partcorpart_cor2 = zone2%coupling(ncoupl2)%partcorif (typ_cor1 .ne. typ_cor2) then call erreur("DEVELOPPEMENT", & "Types de correction differents non implementes")endifselect case(typtemps) case(instationnaire) ! On applique des corrections de flux entre les echanges call choixcorrection(zone1, zone2, placement, corcoef, typ_cor1, nfacelim,& nbc1, nbc2, ncoupl2) ! Correction if (placement == avant) then! DEBUGprint*, "CORRECTION AVANT" call correction(zone1, zone2, nfacelim, corcoef, nbc1, nbc2, ncoupl1, & ncoupl2, part_cor1, part_cor2, typ_cor1, typ_cor2, .false.) endifendselect! -----------------PROVISOIRE------------------------------------------------!if ((icycle.lt.10)) then! call output_field(uf, zone1%ust_mesh, zone2%ust_mesh, zone1%field, &! zone2%field,"APRES CORRECTION")!endif!-----------------------------------------------------------------------------typsolver1 = zone1%defsolver%typ_solvertypsolver2 = zone2%defsolver%typ_solver! Donnees geometriques :do i=1, nfacelim ! indices des faces concernees if = zone1%grid%umesh%boco(nbc1)%iface(i) if2 = zone2%grid%umesh%boco(nbc2)%iface(zone2%coupling(ncoupl2)%zcoupling%connface(i)) normale(i) = zone1%grid%umesh%mesh%iface(if,1,1)%normale cgface = zone1%grid%umesh%mesh%iface(if,1,1)%centre ic = zone1%grid%umesh%facecell%fils(if,1) cg1 = zone1%grid%umesh%mesh%centre(ic,1,1) ic = zone2%grid%umesh%facecell%fils(if2,1) cg2 = zone2%grid%umesh%mesh%centre(ic,1,1) ! calcul du vecteur unitaire "inter-cellules" vecinter(i) = (cg2 - cg1) / abs((cg2 - cg1)) ! calcul des distances d1 et d2 entre les cellules (des zones 1 et 2) et l'interface. !d1(i) = (cgface-cg1).scal.vecinter(i) !d2(i) = (cg2-cgface).scal.vecinter(i) d1(i) = (cgface-cg1).scal.(cgface-cg1)/abs((cgface-cg1).scal.normale(i)) d2(i) = (cgface-cg2).scal.(cgface-cg2)/abs((cgface-cg2).scal.normale(i))enddo ! Type de methode de calcul:typmethod = zone1%defsolver%boco(zone1%grid%umesh%boco(nbc1)%idefboco)%typ_calc! = zone2%defsolver%boco(zone2%grid%umesh%boco(nbc2)%idefboco)%typ_calc! Valeurs des donnees instationnaires a echangercall donnees_echange(zone1%coupling(ncoupl1)%zcoupling%solvercoupling, & zone1%coupling(ncoupl1)%zcoupling%echdata, & zone1, nbc1, zone2%coupling(ncoupl2)%zcoupling%echdata, & zone2, nbc2, ncoupl1, ncoupl2, typ_cor1)! Calcul des conditions de raccordcall echange(zone1%coupling(ncoupl1)%zcoupling%echdata, & zone2%coupling(ncoupl2)%zcoupling%echdata, & normale, vecinter, d1, d2, nfacelim, typcalc, typmethod,& zone1%coupling(ncoupl1)%zcoupling%solvercoupling, & zone1%defsolver%boco(zone1%grid%umesh%boco(nbc1)%idefboco), & zone2%defsolver%boco(zone2%grid%umesh%boco(nbc2)%idefboco), & zone2%coupling(ncoupl2)%zcoupling%connface)select case(typtemps) case(instationnaire) ! On applique des corrections de flux entre les echanges if (placement == apres) then! DEBUGprint*, "CORRECTION APRES" if (typ_cor1 .ne. bocoT) then call correction(zone1, zone2, nfacelim, corcoef, nbc1, nbc2, ncoupl1, & ncoupl2, part_cor1, part_cor2, typ_cor1, typ_cor2, & .false.) endif endifendselectendsubroutine echange_zonematch!------------------------------------------------------------------------------!! Historique des modifications!! mai 2003 : creation de la procedure! juil 2003 : ajouts pour corrections de flux! oct 2003 : ajout coef correction de flux! oct 2003 : correction de flux seulement pour le cas instationnaire! jan 2004 : orientation vers des corrections de flux avant ou apres! le calcul des quantites d'interface selon les cas! fev 2004 : procedures choixcorrection, correction!------------------------------------------------------------------------------!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -