summaryrefslogtreecommitdiff
path: root/Dragon/src/g2s_boundCond.f90
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/g2s_boundCond.f90
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/g2s_boundCond.f90')
-rw-r--r--Dragon/src/g2s_boundCond.f901738
1 files changed, 1738 insertions, 0 deletions
diff --git a/Dragon/src/g2s_boundCond.f90 b/Dragon/src/g2s_boundCond.f90
new file mode 100644
index 0000000..a7223c7
--- /dev/null
+++ b/Dragon/src/g2s_boundCond.f90
@@ -0,0 +1,1738 @@
+!
+!-----------------------------------------------------------------------
+!
+!Purpose:
+! Process data relative to boundary conditions.
+!
+!Copyright:
+! Copyright (C) 2001 Ecole Polytechnique de Montreal.
+! This library is free software; you can redistribute it and/or
+! modify it under the terms of the GNU Lesser General Public
+! License as published by the Free Software Foundation; either
+! version 2.1 of the License, or (at your option) any later version.
+!
+!Author(s):
+! G. Civario (CS-SI)
+!
+!Comments:
+! Deux structures differentes ont ete definies en variables globales:
+! - bCData : pour stocker les donnees en entree du code
+! - SALbCData : pour stocker les donnees correspondantes a fournir dans
+! le jeux de donnees SAL genere
+! Le fonction definies sont
+! - appliBoundariConditions : calcule les valeurs des champs des structures
+! en appelant les fonctions specifiques a chaque
+! type de geometrie
+! \\\\
+! - initializebCData : mise a zero des stuctures
+! - destroybCData : liberation de la memoire
+! - appliBoundariConditionsForXXX : fonction specifique au type XXX avec
+! XXX = Rec, Hex, Tri ou Tub
+! - setBoundSide : applique une condition limite de contact aux elements
+! - setBoundCut : applique une condition limite avec reduction du domaine
+! aux elements
+! - prepareSALBCData : prepare les donnees de conditions limites pour SAL
+!
+!-----------------------------------------------------------------------
+!
+module boundCond
+ use cellulePlaced
+ use constType
+ use constUtiles
+ use GANLIB
+ use segArc
+
+ implicit none
+
+ type t_bCData
+ double precision,dimension(2) :: sidexy !longueur en xy de la gigogne
+ !ext (pour rec et tri ST60 ou COMPLETE), ou cote d'un hexagone et cote
+ !de l'assemblage (pour hexa et tri S30 et SA60)
+ double precision,dimension(4) :: minmaxXY
+ integer,dimension(6) :: bc
+ double precision,dimension(6) :: albedo
+ integer,dimension(6) :: albInd
+ double precision,dimension(2) :: toOrig_xy !vecteur de translation du
+ !centre vers le coins inferieur gauche
+ integer :: iHex !type de geo si hexagone
+ integer :: iTri !type de geo si triangle
+ end type t_bCData
+
+ type(t_bCData),save :: bCData
+
+ type t_SALbCData
+ integer :: sunsetType
+ integer :: SALtype
+ integer :: nber
+ integer,dimension(:),allocatable :: elemNb
+ real :: albedo
+ real :: tx,ty
+ real :: cx,cy,angle
+ end type t_SALbCData
+
+ type(t_SALbCData),dimension(6),save :: SALbCDataTab
+
+contains
+
+ subroutine initializebCData()
+ SALbCDataTab(:6)%nber = 0
+ end subroutine initializebCData
+
+ subroutine destroybCData()
+ integer :: i
+ do i = 1,6
+ if (allocated(SALbCDataTab(i)%elemNb)) then
+ deallocate(SALbCDataTab(i)%elemNb)
+ end if
+ end do
+ end subroutine destroybCData
+
+ subroutine appliBoundariConditions(ip,szSA,nbCLP)
+ type(c_ptr),intent(in):: ip
+ integer,intent(inout) :: szSA
+ integer,intent(out) :: nbCLP
+
+ select case(geomTyp)
+ case(RecTyp)
+ ! write(*,*) 'entering appliBoundariConditionsForRec'
+ call appliBoundariConditionsForRec(ip,szSA,nbCLP)
+ case(HexTyp)
+ ! write(*,*) 'entering appliBoundariConditionsForHex'
+ call appliBoundariConditionsForHex(ip,szSA,nbCLP)
+ case(TriaTyp)
+ ! write(*,*) 'entering appliBoundariConditionsForTri'
+ call appliBoundariConditionsForTri(ip,szSA,nbCLP)
+ case(TubeTyp)
+ ! write(*,*) 'entering appliBoundariConditionsForTub'
+ call appliBoundariConditionsForTub(ip,nbCLP)
+ end select
+ end subroutine appliBoundariConditions
+
+ subroutine appliBoundariConditionsForRec(geoIp,szSA,nbCLP)
+ type(c_ptr),intent(in) :: geoIp
+ integer,intent(inout) :: szSA
+ integer,intent(out) :: nbCLP
+
+ double precision :: rminx,rminy,rmaxx,rmaxy
+ double precision,dimension(4) :: x,y,xx,yy,cx,cy,cxx,cyy
+ type(c_ptr) :: ip
+ integer :: i,nbCut
+ real,dimension(2) :: tmpTab2
+ real,dimension(4) :: tmpTab4
+ real,dimension(6) :: tmpTab6
+ type(t_segArc) :: sg
+
+ ! programmation defensive
+ integer :: dimTabSegArc
+
+ dimTabSegArc = size(tabSegArc)
+
+ ip = geoIp
+ !recuperations des donnees sur les conditions aux limites
+ call LCMGET(ip,'NCODE ',bCData%bc)
+ call LCMGET(ip,'ZCODE ',tmpTab6) ; bCData%albedo=tmpTab6
+ call LCMGET(ip,'ICODE ',bCData%albInd)
+ ! write(*,*) 'NCODE :',bCData%bc
+ ! write(*,*) 'ZCODE :',bCData%albedo
+ ! write(*,*) 'ICODE :',bCData%albInd
+ call LCMSIX(ip,'NEW-DATA ',1)
+ call LCMSIX(ip,'BOUND-DATA ',1)
+ call LCMGET(ip,'SIDEXY ',tmpTab2) ; bCData%sidexy=tmpTab2
+ call LCMGET(ip,'MINMAXXY ',tmpTab4) ; bCData%minmaxXY=tmpTab4
+ call LCMSIX(ip,'BOUND-DATA ',2)
+ call LCMSIX(ip,'NEW-DATA ',2)
+
+ !exploitation des donnees
+ rmaxx = 0.5d0*bCData%sidexy(1) ; rminx = -rmaxx
+ rmaxy = 0.5d0*bCData%sidexy(2) ; rminy = -rmaxy
+ x(1) = rminx ; y(1) = rmaxy ; xx(1) = rminx ; yy(1) = rminy
+ x(2) = rmaxx ; y(2) = rminy ; xx(2) = rmaxx ; yy(2) = rmaxy
+ x(3) = rminx ; y(3) = rminy ; xx(3) = rmaxx ; yy(3) = rminy
+ x(4) = rmaxx ; y(4) = rmaxy ; xx(4) = rminx ; yy(4) = rmaxy
+ cx(1) = bCData%minmaxXY(1) ; cy(1) = rmaxy
+ cxx(1) = bCData%minmaxXY(1) ; cyy(1) = rminy
+ cx(2) = bCData%minmaxXY(3) ; cy(2) = rminy
+ cxx(2) = bCData%minmaxXY(3) ; cyy(2) = rmaxy
+ cx(3) = rminx ; cy(3) = bCData%minmaxXY(2)
+ cxx(3) = rmaxx ; cyy(3) = bCData%minmaxXY(2)
+ cx(4) = rmaxx ; cy(4) = bCData%minmaxXY(4)
+ cxx(4) = rminx ; cyy(4) = bCData%minmaxXY(4)
+
+ !creation des conditions aux limites (pour une geometrie carre)
+ !lorsqu'on coupe, on garde le cote gauche (sens trigo)
+ nbCLP=0
+ nbCut=0
+ do i = 1,4
+ select case(bCData%bc(i))
+ case(B_Void,B_Refl,B_Ssym,B_Albe,B_Zero,B_Tran,B_Pi_2,B_Pi)
+ !write(*,*) 'reflective boundary condition ',i
+ if (bCData%bc(i)/=B_Void) nbCLP=nbCLP+1
+ call setBoundSide(x(i),y(i),xx(i),yy(i),bCData%bc(i)+100*i,szSA)
+ case(B_Diag)
+ !write(*,*) 'diagonal symmetry ',i,"seg ",szsa+1
+ if (i>=3) cycle
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForRec (1)")
+ if (i==1) then
+ sg=createSeg(x(4),y(4),x(3),y(3),fooMix,-(bCData%bc(i)+100*i))
+ else
+ sg=createSeg(x(3),y(3),x(4),y(4),fooMix,-(bCData%bc(i)+100*i))
+ end if
+ tabSegArc(szSA)=sg
+ case(B_Syme)
+ !write(*,*) 'syme ', i,"seg ",szsa+1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForRec (1)")
+ sg=createSeg(cx(i),cy(i),cxx(i),cyy(i),fooMix,-(bCData%bc(i)+100*i))
+ tabSegArc(szSA)=sg
+ end select
+ end do
+ if (nbCut/=0) call setBoundCut_V2(nbCut,szSA)
+ end subroutine appliBoundariConditionsForRec
+
+ subroutine setBoundSide(x,y,xx,yy,nbCL,szSA)
+ double precision,intent(in) :: x,y,xx,yy
+ integer,intent(in) :: nbCL,szSA
+
+ type(t_segArc) :: sa
+ integer :: i
+
+ do i = 1,szSA
+ sa = tabSegArc(i)
+ if (sa%typ/=tseg) cycle
+ if (.not. ( estColi(xx-x,yy-y,sa%dx-sa%x,sa%dy-sa%y) .and. &
+ & pointsAlignes(x,y,xx,yy,sa%x,sa%y) ) ) cycle
+ if (sa%mixd==fooMix) then
+ tabSegArc(i)%mixd=-nbCL
+ else if (sa%mixg==fooMix) then
+ tabSegArc(i)%mixg=-nbCL
+ end if
+ end do
+ end subroutine setBoundSide
+
+ subroutine setBoundCut_V2(nbCut,szSA)
+ integer, intent(in) :: nbCut
+ integer, intent(inout) :: szSA
+
+ ! segments management
+ integer :: iSA, iSC, iStr, thisSA, thisOtherSA, szSC
+ type(t_SegArc) :: SA, SA1, SA2, SA3, SC, SC1, SC2, SC3
+ double precision :: interangle, interAngle2, RefAngle, RefOtherAngle
+ double precision :: thisAngle, thisOtherAngle, angle1,angle2
+ ! follow up for intersections
+ logical :: L_Inter, test1, test2, test3, test4
+ type(t_point) :: P1, P2, P3, P4
+ integer :: n1, n2
+ double precision :: aox,aoy,afx,afy
+ ! sort
+ ! find minimal angle
+ double precision :: SCAngle, SA_x,SA_y,SA_dx,SA_dy
+
+ ! Part 1 : Backup of cutting straights & updating
+ allocate(tabStrCut(nbCut), tabSegCut(szSA),stat=alloc_ok)
+ if (alloc_ok /= 0) call XABORT("G2S: setBoundCut_V2 => allocation pb")
+ tabStrCut(1:nbCut) = tabSegArc(szSA-nbCut+1:szSA)
+ szSA = szSA - nbCut
+ !
+ ! Part2 : Adaptation for cutting Straights
+ B_A1: do iStr = 1, nbCut
+ SC = tabStrCut(iStr)
+ B_B1: do iSA = iStr+1, nbCut
+ SA = tabStrCut(iSA)
+ L_Inter = InterSgSg_V2(SC,SA,n1,n2,P1,P2)
+ if (L_Inter.and.n2==0) then
+ SA1 = copySegExceptEnd(P1%x,P1%y,SA)
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA1%x,SA1%y)) then
+ tabStrCut(iSA) = SA1
+ else
+ SA1 = copySegExceptOrigin(P1%x,P1%y,SA)
+ tabStrCut(iSA) = SA1
+ endif
+ end if
+ enddo B_B1
+ enddo B_A1
+
+ ! Part 3 : process for the current straight
+ B_A2: do iStr = 1, nbCut
+ szSC = 1
+ tabSegCut(szSC) = tabStrCut(iStr)
+ iSC = szSC
+
+ B_B2: do
+ if (iSC > szSC) exit B_B2
+ SC = tabSegCut(iSC)
+ iSA = 1
+ B_C2: do
+ if (iSA > szSA) exit B_C2
+ SA = tabSegArc(iSA)
+ if (SA%typ == tseg) then
+ ! SA is a segment
+ L_Inter = InterSgSg_V2(SC,SA,n1,n2,P1,P2)
+ if (.not.L_Inter) then
+ ! no intersection
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%x,SA%y).or.&
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%dx,SA%dy)) then
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+ cycle B_C2
+ elseif (L_Inter.and.(n2==0)) then
+ ! only one intersection point
+ if (n1 == 22) then
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,SC%dx,SC%dy,SC%mixg,SC%mixd)
+ SC = ReplaceSC(SC1,iSC)
+ call AddSC(SC2,szSC)
+ SA1 = copySegExceptEnd(P1%x,P1%y,SA)
+ if (.not.estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA1%x,SA1%y)) &
+ SA1 = copySegExceptOrigin(P1%x,P1%y,SA)
+ SA = ReplaceSA(SA1,iSA) ; iSA = iSA + 1
+
+ elseif ((n1 == 21).or.(n1 == 23)) then
+ ! the intersection point
+ SA1 = copySegExceptEnd(P1%x,P1%y,SA)
+ if (.not.estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA1%x,SA1%y))&
+ SA1 = copySegExceptOrigin(P1%x,P1%y,SA)
+ SA = ReplaceSA(SA1,iSA) ; iSA = iSA + 1
+
+ elseif ((n1==11).or.(n1==13).or.(n1==31).or.(n1==33)) then
+ if ( ((n1==11).and.&
+ estAGAuche(SC%x,SC%y,SC%dx,SC%dy,SA%dx,SA%dy)) .or. &
+ ((n1==13).and.&
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%dx,SA%dy)) .or. &
+ ((n1==31).and.&
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%x,SA%y )) .or. &
+ ((n1==33).and.&
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%x, SA%y ))) then
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+
+ elseif ((n1 == 12).or.(n1 == 32)) then
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,SC%dx,SC%dy,SC%mixg,SC%mixd)
+ SC = ReplaceSC(SC1,iSC)
+ call AddSC(SC2,szSC)
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,SA%x,SA%y)) then
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+ else
+ call XABORT("SetBoundCut_V2 : inconsistency")
+ endif
+ cycle B_C2
+
+ else ! (L_Inter.and.n2 /= 0 )
+ call OverlaidSegmentsManagement(n1,n2,iSC,szSC,SC,iSA,szSA,SA)
+ cycle B_C2
+ endif
+ else
+ ! Sa is an arc or a circle
+ L_Inter = interSgAr_V2(SC,SA,n1,n2,P1,P2)
+ if (SA%typ == tarc) then
+ call giveOrigine(SA,Aox,Aoy) ; call giveExtremite(SA,Afx,Afy)
+ endif
+ if (.not.L_Inter) then
+ if (SA%typ /= tcer) then
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,aox,aoy).or. &
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,afx,afy)) then
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+ else
+ ! SA is a circle
+ call giveFourPointsOnCircle(SA,P1,P2,P3,P4)
+ test1 = estAGauche(SC%x,SC%y,SC%dx,SC%dy,P1%x,P1%y)
+ test2 = estAGauche(SC%x,SC%y,SC%dx,SC%dy,P2%x,P2%y)
+ test3 = estAGauche(SC%x,SC%y,SC%dx,SC%dy,P3%x,P3%y)
+ test4 = estAGauche(SC%x,SC%y,SC%dx,SC%dy,P4%x,P4%y)
+ if (test1.or.test2.or.test3.or.test4) then
+ ! circle will be cut by another SC
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+ endif
+ cycle B_C2
+ elseif (n2 == 0) then
+ if (n1>100) then
+ ! one intersection point which is a tangency point
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,aox,aoy)) then
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,SC%x,SC%y,SC%mixg,SC%mixd)
+ SC = ReplaceSC(SC1,iSC)
+ call AddSC(SC2,szSC)
+ interAngle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ if (SA%typ == tarc) then
+ SA1 = copyArcExceptEnd(interAngle,SA)
+ SA2 = copyArcExceptOrigin(interAngle,SA)
+ SA = ReplaceSA(SA1,iSA)
+ call AddSA(SA2,szSA)
+ else
+ interangle2 = anglenormal(interangle+pi_c)
+ SA1 = createArcFromCircle(interAngle,interAngle2,SA)
+ SA2 = createArcFromCircle(interAngle2,interAngle,SA)
+ SA = ReplaceSA(SA1,iSA)
+ call AddSA(SA2,szSA)
+ end if
+ iSA = iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ end if
+ elseif (n1<100) then
+ ! one intersection point P1
+ if (mod(n1,10) == 2) then
+ ! P1 is inside segment
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,SC%dx,SC%dy,SC%mixg,SC%mixd)
+ SC = ReplaceSC(SC1,iSC)
+ call AddSC(SC2,szSC)
+ interAngle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ if (n1/10 == 2) then
+ if (SA%typ == tarc) then
+ SA1 = copyArcExceptEnd(interAngle,SA)
+ if (.not.estAGauche &
+ (SC%x,SC%y,SC%dx,SC%dy,aox,aoy)) &
+ SA1 = copyArcExceptOrigin(interAngle,SA)
+ SA = ReplaceSA(SA1,iSA)
+ else
+ interangle2 = anglenormal(interangle+pi_c)
+ SA1 = createArcFromCircle &
+ (interAngle,interAngle2,SA)
+ call MediumPointOnArc(SA1,P1)
+ if (.not.estAGauche &
+ (SC%x,SC%y,SC%dx,SC%dy,P1%x,P1%y)) &
+ SA1 = createArcFromCircle &
+ (interAngle2,interAngle,SA)
+ SA = ReplaceSA(SA1,iSA)
+ endif
+ endif
+ else
+ ! P1 is the begin or the end of SC
+ if (n1/10 == 2) then
+ ! P1 is inside SA
+ interAngle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ if (SA%typ == tarc) then
+ SA1 = copyArcExceptEnd(interAngle,SA)
+ if (.not.estAGauche &
+ (SC%x,SC%y,SC%dx,SC%dy,aox,aoy)) &
+ SA1 = copyArcExceptOrigin(interAngle,SA)
+ else
+ interangle2 = anglenormal(interangle+pi_c)
+ SA1 = createArcFromCircle &
+ (interAngle,interAngle2,SA)
+ call MediumPointOnArc(SA1,P1)
+ if (.not.estAGauche &
+ (SC%x,SC%y,SC%dx,SC%dy,P1%x,P1%y)) &
+ SA1 = createArcFromCircle &
+ (interAngle2,interAngle,SA)
+ endif
+ SA = ReplaceSA(SA1,iSA)
+ SC = ReplaceSC(SC1,iSC)
+ iSA = iSA + 1
+ else
+ ! P1 is at the begin or the end of SA
+ if (((n1/10==1).and. &
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,afx,afy)) &
+ .or. &
+ ((n1/10==3).and. &
+ estAGauche(SC%x,SC%y,SC%dx,SC%dy,aox,aoy))) then
+ iSA =iSA + 1
+ else
+ call SlideSA(iSA,szSA)
+ endif
+ endif
+ endif
+ endif
+ else
+ ! two points of intersection
+ if ((n1==21.and.n2==23) .or.(n1==23.and.n2==21)) then
+ ! the intersection points are the extremities of SA
+ interangle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ interangle2 = calculeAngle(SA%x,SA%y,P2%x,P2%y)
+ angle1 = min(interangle,interangle2)
+ angle2 = max(interangle,interangle2)
+ if (SA%a > SA%b) then
+ SA1 = CopyArcExceptEnd(angle1,SA)
+ SA2 = CopyArcWithNewAngles(angle1,angle2,SA)
+ SA3 = CopyArcExceptOrigin(angle2,SA)
+ else
+ SA1 = CopyArcExceptEnd(angle2,SA)
+ SA2 = CopyArcWithNewAngles(angle2,angle1,SA)
+ SA3 = CopyArcExceptOrigin(angle1,SA)
+ endif
+ call MediumPointOnArc(SA2,P1)
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,P1%x,P1%y)) then
+ SA = ReplaceSA(SA2,iSA)
+ else
+ SA = ReplaceSA(SA1,iSA)
+ call AddSA(SA3,szSA)
+ end if
+ iSA = iSA + 1
+ elseif((n1==12.and.n2==32).or.(n1==32.and.n2==12)) then
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,P2%x,P2%y,SC%mixg,SC%mixd)
+ SC3 = createSeg(P2%x,P2%y,SC%dx,SC%dy,SC%mixg,SC%mixd)
+ SC = ReplaceSC(SC1,iSC)
+ call Add2SC(SC2,SC3,szSC)
+ iSA = iSA + 1
+ elseif ((n1==11.and.n2==33).or. &
+ (n1==31.and.n2==13).or. &
+ (n1==13.and.n2==31)) then
+ ! P1 and P2 are at the begin or the end of SA and SC
+ ! nothing to do
+ iSA = iSA + 1
+ else
+ SC1 = createSeg(SC%x,SC%y,P1%x,P1%y,SC%mixg,SC%mixd)
+ SC2 = createSeg(P1%x,P1%y,P2%x,P2%y,SC%mixg,SC%mixd)
+ SC3 = createSeg(P2%x,P2%y,SC%dx,SC%dy,SC%mixg,SC%mixd)
+ if (SA%typ == tarc) then
+ interAngle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ SA1 = copyArcExceptEnd(interAngle,SA)
+ interAngle = calculeAngle(SA%x,SA%y,P2%x,P2%y)
+ SA2 = copyArcWithNewAngles(SA1%b,interAngle,SA)
+ SA3 = copyArcExceptOrigin(SA2%a,SA)
+ ! if SA1 is on left side, SA3 is on left side too
+ ! if SA1 isn't on left side, SA2 is on left side
+ call giveOrigine(SA1,aox,aoy)
+ if (estAGauche(SC%x,SC%y,SC%dx,SC%dy,aox,aoy)) then
+ SA = ReplaceSA(SA1,iSA)
+ call AddSA(SA3,szSA)
+ else
+ SA = ReplaceSA(SA2,iSA)
+ endif
+ else
+ interAngle = calculeAngle(SA%x,SA%y,P1%x,P1%y)
+ interAngle2 = calculeAngle(SA%x,SA%y,P2%x,P2%y)
+ SA1 = createArcFromCircle(interAngle2,interAngle,SA)
+ call MediumPointOnArc(SA1,P3)
+ if (.not.estAGauche(SC%x,SC%y,SC%dx,SC%dy,P3%x,P3%y)) &
+ SA1 = createArcFromCircle &
+ (interAngle,interAngle2,SA)
+ SA = ReplaceSA(SA1,iSA)
+ endif
+ SC = ReplaceSC(SC1,iSC)
+ call Add2SC(SC2,SC3,szSC)
+ iSA = iSA + 1
+ endif
+ endif
+ cycle B_C2
+ endif
+ enddo B_C2
+ iSC = iSC + 1
+ enddo B_B2
+
+!!$ ! Part 3 : Sort
+!!$ B_B3:do iSC = 1,szSC-1
+!!$ P1%x = tabSegCut(iSC)%dx ; P1%y = tabSegCut(iSC)%dy
+!!$ B_C3:do jSC = iSC+1,szSC
+!!$ if (tabSegCut(jSC)%x == P1%x .and.tabSegCut(jSC)%y == P1%y) then
+!!$ if(jSC==iSC+1) then ; cycle B_B3
+!!$ else
+!!$ SCBuffer = tabSegCut(iSC+1)
+!!$ tabSegCut(iSC+1) = tabSegCut(jSC)
+!!$ tabSegCut(jSC) = SCBuffer
+!!$ endif
+!!$ end if
+!!$ end do B_C3
+!!$ end do B_B3
+
+ ! Part 4 : search for neighbourhood informations
+ B_B4: do iSC = 1, szSC
+ SC = tabSegCut(iSC)
+ thisSA = 0 ; thisOtherSA = 0
+ RefAngle = infinity ; RefOtherAngle = infinity
+ SCAngle = calculeAngle(SC%x,SC%y,SC%dx,SC%dy)
+ ! Mix awarding
+ B_C4: do iSA = 1, szSA
+ SA = tabSegArc(iSA)
+ if (SA%typ == tseg) then
+ if (IsEqualConst(SC%x,SA%x).and.IsEqualConst(SC%y,SA%y)) then
+ thisAngle = calculeAngle(SA%x,SA%y,SA%dx,SA%dy) - SCAngle
+ if (thisAngle < RefAngle) then
+ thisSA = iSA ; RefAngle = thisAngle
+ endif
+ elseif (IsEqualConst(SC%x,SA%dx).and.IsEqualConst(SC%y,SA%dy)) then
+ thisAngle = calculeAngle(SA%x,SA%y,SA%dx,SA%dy) + SCAngle
+ if (thisAngle < RefAngle) then
+ thisSA = iSA ; RefAngle = thisAngle
+ endif
+ endif
+ else if (SA%typ == tarc) then
+ call giveOrigine(SA,SA_x,SA_y)
+ call giveExtremite(SA,SA_dx,SA_dy)
+ if (IsEqualConst(SC%x,SA_x) .and. IsEqualConst(SC%y,SA_y)) then
+ thisAngle = SA%a + pi_2_c - SCAngle
+ if (thisAngle < RefAngle) then
+ thisSA = iSA ; RefAngle = thisAngle
+ endif
+ elseif (IsEqualConst(SC%x,SA_dx).and.IsEqualConst(SC%y,SA_dy)) then
+ thisAngle = SA%b - pi_2_c + SCAngle
+ if (thisAngle < RefAngle) then
+ thisSA = iSA ; RefAngle = thisAngle
+ endif
+ endif
+ endif
+ enddo B_C4
+ if (thisSA == 0) then
+ call XABORT('unable to find element thisSA')
+ endif
+ if (tabSegArc(thisSA)%typ == tseg) then
+ if (isEqualConst(tabSegArc(ThisSA)%x,SC%x).and. &
+ isEqualConst(tabSegArc(ThisSA)%y,SC%y)) then
+ SC%mixg = tabSegArc(thisSA)%mixd
+ SC%nodeg = tabSegArc(thisSA)%noded
+ SC%IndCellPg = tabSegArc(thisSA)%indCellPd
+ elseif(isEqualConst(tabSegArc(ThisSA)%dx,SC%x).and. &
+ isEqualConst(tabSegArc(ThisSA)%dy,SC%y)) then
+ SC%mixg = tabSegArc(thisSA)%mixg
+ SC%nodeg = tabSegArc(thisSA)%nodeg
+ SC%IndCellPg = tabSegArc(thisSA)%indCellPg
+ else
+ call XABORT("SetBoundCut_V2 : mix error (1)")
+ endif
+ else
+ call giveOrigine(tabSegArc(thisSA),SA_x,SA_y)
+ call giveExtremite(tabSegArc(thisSA),SA_dx,SA_dy)
+ if (isEqualConst(SA_x,SC%x).and.isEqualConst(SA_y,SC%y)) then
+ SC%mixg = tabSegArc(thisSA)%mixd
+ SC%nodeg = tabSegArc(thisSA)%noded
+ SC%IndCellPg = tabSegArc(thisSA)%indCellPd
+ elseif (isEqualConst(SA_dx,SC%x).and.isEqualConst(SA_dy,SC%y)) then
+ SC%mixg = tabSegArc(thisSA)%mixg
+ SC%nodeg = tabSegArc(thisSA)%nodeg
+ SC%IndCellPg = tabSegArc(thisSA)%indCellPg
+ else
+ call XABORT("SetBoundCut_V2 : mix error (2)")
+ endif
+ endif
+
+ ! Mix control
+ SCAngle = calculeAngle(SC%dx,SC%dy,SC%x,SC%y)
+ B_C5: do iSA = 1,szSA
+ SA = tabSegArc(iSA)
+ if (SA%typ == tseg) then
+ if (IsEqualConst(SC%dx,SA%dx).and.IsEqualConst(SC%dy,SA%dy)) then
+ thisOtherAngle = calculeAngle(SA%x,SA%y,SA%dx,SA%dy) + SCAngle
+ if (thisOtherAngle < RefOtherAngle) then
+ thisOtherSA = iSA ; RefOtherAngle = thisOtherAngle
+ endif
+ elseif (IsEqualConst(SC%dx,SA%x).and.IsEqualConst(SC%dy,SA%y)) then
+ thisOtherAngle = calculeAngle(SA%x,SA%y,SA%dx,SA%dy) - SCAngle
+ if (thisOtherAngle < RefOtherAngle) then
+ thisOtherSA = iSA ; RefOtherAngle = thisOtherAngle
+ endif
+ endif
+ elseif (SA%typ == tarc) then
+ call giveOrigine(SA,SA_x,SA_y)
+ call giveExtremite(SA,SA_dx,SA_dy)
+ if (IsEqualConst(SC%dx,SA_dx).and.IsEqualConst(SC%dy,SA_dy)) then
+ thisOtherAngle = SA%B + pi_2_c - SCAngle
+ if (thisOtherAngle < RefOtherAngle) then
+ thisOtherSA = iSA ; RefOtherAngle = thisOtherAngle
+ endif
+ elseif (IsEqualConst(SC%dx,SA_x).and.IsEqualConst(SC%dy,SA_y)) then
+ thisOtherAngle = SA%a - pi_2_c + SCAngle
+ if (thisOtherAngle < RefOtherAngle) then
+ thisOtherSA = iSA ; RefOtherAngle = thisOtherAngle
+ endif
+ endif
+ endif
+ enddo B_C5
+ if (thisOtherSA == 0) then
+ ! we do not find a neigbour for SC
+ call XABORT("SetBoundCut_V2 : incredible situation too")
+ endif
+ if (tabSegArc(thisOtherSA)%typ == tseg) then
+ if (IsEqualConst(SC%dx,tabSegArc(thisOtherSA)%x).and. &
+ IsEqualConst(SC%dy,tabSegArc(thisOtherSA)%y)) then
+ if (SC%mixg /= tabSegArc(thisOtherSA)%mixg) then
+ call XABORT("SetBoundCut_V2 : mix error (3)")
+ endif
+ elseif (IsEqualConst(SC%dx,tabSegArc(thisOtherSA)%dx).and. &
+ IsEqualConst(SC%dy,tabSegArc(thisOtherSA)%dy)) then
+ if (SC%mixg /= tabSegArc(thisOtherSA)%mixd) then
+ call XABORT("SetBoundCut_V2 : mix error (4)")
+ end if
+ else
+ call XABORT("SetBoundCut_V2 : mix error (5)")
+ endif
+ else
+ call giveOrigine(tabSegArc(thisOtherSA),SA_x,SA_y)
+ call giveExtremite(tabSegArc(thisOtherSA),SA_dx,SA_dy)
+ if (isEqualConst(SC%dx,SA_x).and.isEqualConst(SC%dy,SA_y)) then
+ if (SC%mixg /= tabSegArc(thisOtherSA)%mixg) then
+ call XABORT("SetBoundCut_V2 : mix error (6)")
+ end if
+ elseif(isEqualCOnst(SC%dx,SA_dx).and. &
+ isEqualConst(SC%dy,SA_dy)) then
+ if (SC%mixg /= tabSegArc(thisOtherSA)%mixd) then
+ call XABORT("SetBoundCut_V2 : mix error (7)")
+ endif
+ else
+ call XABORT("SetBoundCut_V2 : mix error (8)")
+ endif
+ endif
+ tabSegCut(iSC) = SC
+ enddo B_B4
+ if (szSA+szSC > size(TabSegArc)) call XABORT("InterSgSg_V2 : memory problem (1)")
+ ! Transfer
+ tabSegArc(szSA+1:szSA+szSC) = tabSegCut(1:szSC)
+ szSA = szSA + szSC
+ szSC = 0
+ enddo B_A2
+
+ deallocate(tabSegCut, tabStrCut)
+ end subroutine setBoundCut_V2
+
+ subroutine setBoundCut(nbCut,szSA)
+ integer,intent(in) :: nbCut
+ integer,intent(inout) :: szSA
+
+ type(t_segArc) :: sa,sgi,sg,ar
+ type(segArcArrayTer),dimension(:),allocatable :: tmpTab
+ double precision :: intx,inty,pt1x,pt1y,pt2x,pt2y,angl
+ integer :: i,j,sizeTmp,nbPtInter,sztmp
+ logical :: oInSa,eInSa,oInSgi,eInSgi
+
+ ! programmation defensive
+ integer :: taille_table_tmpTab
+
+ !on coupe le domaine de maniere symetrique
+ ! et on garde les elements a gauche de l'axe de coupe
+ !copie dans un tableau temporaire des segments
+ !et nettoyage du tableau global
+
+ sztmp = szSA*10
+ ! programmation defensive
+ taille_table_tmpTab = sztmp
+ allocate(tmpTab(sztmp),stat=alloc_ok)
+ if (alloc_ok /= 0) call XABORT("G2S: setBoundCut(1) => allocation pb")
+ do i = 1,nbCut
+ tmpTab(i)%sa=tabSegArc(szSA-nbCut+i)
+ tmpTab(i)%keep=.true. ; tmpTab(i)%cl=.true.
+ end do
+ do i = 1,szSA-nbCut
+ tmpTab(i+nbCut)%sa=tabSegArc(i)
+ tmpTab(i+nbCut)%keep=.true. ; tmpTab(i+nbCut)%cl=.false.
+ end do
+ sizeTmp=szSA
+
+ !coupage des segments
+ j=0
+ do
+ j = j+1
+ if (j>sizeTmp) exit
+ if (.not. tmpTab(j)%cl .or. .not. tmpTab(j)%keep) cycle
+ sa = tmpTab(j)%sa
+ if (isEqualConst(sa%x,sa%dx).and.isEqualConst(sa%y,sa%dy)) then
+ tmpTab(j)%keep=.false.
+ cycle
+ end if
+ i=0
+ do
+ i = i+1
+ if (i>sizeTmp) exit
+ if ((.not. tmpTab(i)%keep) .or. i==j) cycle
+ if (tmpTab(i)%sa%typ/=tseg) cycle
+ sgi=tmpTab(i)%sa
+ !cas ou les segments de coupe rencontrent d'autres segments sans les
+ ! couper. exemple: les coins des carres pour une symetrie diagonnale
+ oInSa=pointsAlignes(sgi%x,sgi%y,sa%x,sa%y,sa%dx,sa%dy).and. &
+ & (isIn(sgi%x,sgi%y,sa)==2)
+ eInSa=pointsAlignes(sgi%dx,sgi%dy,sa%x,sa%y,sa%dx,sa%dy).and. &
+ & (isIn(sgi%dx,sgi%dy,sa)==2)
+ if (oInSa.and.(.not.eInSa)) then
+ tmpTab(j)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%dx,sgi%dy)) then
+ if (sgi%mixd/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixd
+ else
+ if (sgi%mixg/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixg
+ end if
+ tmpTab(sizeTmp)%sa%x = sgi%x ; tmpTab(sizeTmp)%sa%y = sgi%y
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%dx,sgi%dy)) then
+ if (sgi%mixg/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixg
+ else
+ if (sgi%mixd/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixd
+ end if
+ tmpTab(sizeTmp)%sa%dx = sgi%x ; tmpTab(sizeTmp)%sa%dy = sgi%y
+ exit
+ else if ((.not.oInSa).and.eInSa) then
+ tmpTab(j)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%x,sgi%y)) then
+ !write(*,*) "zaza sbc 5", i, j, sizetmp, sgi%mixG
+ if (sgi%mixg/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixg
+ else
+ !write(*,*) "zaza sbc 6" ,i, j, sizetmp, sgi%mixd
+ if (sgi%mixd/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixd
+ end if
+ tmpTab(sizeTmp)%sa%x = sgi%dx ; tmpTab(sizeTmp)%sa%y = sgi%dy
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%x,sgi%y)) then
+ !write(*,*) "zaza sbc 7", i, j, sizetmp, sgi%mixd
+ if (sgi%mixd/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixd
+ else
+ !write(*,*) "zaza sbc 8", i, j, sizetmp, sgi%mixG
+ if (sgi%mixg/=fooMix) tmpTab(sizeTmp)%sa%mixg = sgi%mixg
+ end if
+ tmpTab(sizeTmp)%sa%dx = sgi%dx ; tmpTab(sizeTmp)%sa%dy = sgi%dy
+ exit
+ end if
+ !cas ou les segments a couper interceptent le segment de coupe a
+ ! une de ses extremites. Exemple: bord du domaine pour la symetrie
+ ! non diagonale sur un carre
+ ! Remarque: pas d'exit , mais un cycle a la fin pour que le segment
+ ! de coupe puisse etre encore utilise
+ oInSgi=pointsAlignes(sa%x,sa%y,sgi%x,sgi%y,sgi%dx,sgi%dy).and. &
+ & (isIn(sa%x,sa%y,sgi)==2)
+ eInSgi=pointsAlignes(sa%dx,sa%dy,sgi%x,sgi%y,sgi%dx,sgi%dy).and. &
+ & (isIn(sa%dx,sa%dy,sgi)==2)
+ if (oInSgi.and.(.not.eInSgi)) then
+ tmpTab(i)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sgi ; tmpTab(sizeTmp)%cl=tmpTab(i)%cl
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%x,sgi%y)) then
+ tmpTab(sizeTmp)%sa%dx=sa%x ; tmpTab(sizeTmp)%sa%dy=sa%y
+ !write(*,*) "zaza sbc 9", i, j, sizetmp, sgi%mixg
+ if (sgi%mixg/=fooMix) tmpTab(j)%sa%mixg=sgi%mixg
+ else
+ tmpTab(sizeTmp)%sa%x=sa%x ; tmpTab(sizeTmp)%sa%y=sa%y
+ !write(*,*) "zaza sbc 10", i, j, sizetmp, sgi%mixd
+ if (sgi%mixd/=fooMix) tmpTab(j)%sa%mixg=sgi%mixd
+ end if
+ tmpTab(sizeTmp)%keep=.true.
+ cycle
+ else if (eInSgi.and.(.not.oInSgi)) then
+ tmpTab(i)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sgi ; tmpTab(sizeTmp)%cl=tmpTab(i)%cl
+ if (estAGauche(sa%x,sa%y,sa%dx,sa%dy,sgi%x,sgi%y)) then
+ tmpTab(sizeTmp)%sa%dx=sa%dx ; tmpTab(sizeTmp)%sa%dy=sa%dy
+ !write(*,*) "zaza sbc 11", i, j, sizetmp, sgi%mixd
+ if (sgi%mixd/=fooMix) tmpTab(j)%sa%mixg=sgi%mixd
+ else
+ tmpTab(sizeTmp)%sa%x=sa%dx ; tmpTab(sizeTmp)%sa%y=sa%dy
+ !write(*,*) "zaza sbc 12", i, j, sizetmp, sgi%mixg
+ if (sgi%mixg/=fooMix) tmpTab(j)%sa%mixg=sgi%mixg
+ end if
+ tmpTab(sizeTmp)%keep=.true.
+ cycle
+ end if
+ !cas ou on coupe vraiment
+ if ( interSgSg(sa,sgi,intx,inty)) then
+ tmpTab(j)%keep=.false. ; tmpTab(i)%keep=.false.
+ sizeTmp=sizeTmp+1 ;
+ tmpTab(sizeTmp)%sa=sgi ; tmpTab(sizeTmp)%cl=tmpTab(i)%cl
+ tmpTab(sizeTmp)%sa%x=intx ; tmpTab(sizeTmp)%sa%y=inty
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+
+ tmpTab(sizeTmp)%sa=sgi ; tmpTab(sizeTmp)%cl=tmpTab(i)%cl
+ tmpTab(sizeTmp)%sa%dx=intx ; tmpTab(sizeTmp)%sa%dy=inty
+ tmpTab(sizeTmp-1)%keep = estAGauche(sa%x,sa%y,sa%dx,sa%dy, &
+ & sgi%dx,sgi%dy)
+ tmpTab(sizeTmp)%keep = .not.tmpTab(sizeTmp-1)%keep
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%sa%x=intx ; tmpTab(sizeTmp)%sa%y=inty
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+
+ tmpTab(sizeTmp)%sa=sa ; tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%sa%dx=intx ; tmpTab(sizeTmp)%sa%dy=inty
+ if (tmpTab(sizeTmp-2)%keep) then
+ tmpTab(sizeTmp)%sa%mixg=sgi%mixd
+ tmpTab(sizeTmp-1)%sa%mixg=sgi%mixg
+ !write(*,*) "zaza sbc 13", i, j, sizetmp, sgi%mixd,sgi%mixg
+ else
+ tmpTab(sizeTmp)%sa%mixg=sgi%mixg
+ tmpTab(sizeTmp-1)%sa%mixg=sgi%mixd
+ !write(*,*) "zaza sbc 14" ,i, j, sizetmp, sgi%mixd,sgi%mixg
+ end if
+ exit
+ end if
+ end do
+ end do
+ do j = 1,nbCut
+ sa = tmpTab(j)%sa
+ do i = nbCut+1,sizeTmp
+ if (.not. tmpTab(i)%keep) cycle
+ sgi=tmpTab(i)%sa
+ if (sgi%typ/=tseg) then
+ !elimination des arcs et cercles du mauvais cote
+ ! le centre de l'arc est a droite du segment de coupe
+ ! => on l'elimine
+ tmpTab(i)%keep=.not.estADroiteStrict(sa%x,sa%y,sa%dx,sa%dy, &
+ & sgi%x,sgi%y)
+ else !elimination des segments du mauvais cote
+ tmpTab(i)%keep=.not.(estADroiteStrict(sa%x,sa%y,sa%dx,sa%dy, &
+ & sgi%x,sgi%y) .or. &
+ & estADroiteStrict(sa%x,sa%y,sa%dx,sa%dy,sgi%dx,sgi%dy) )
+ end if
+ end do
+ end do
+ !coupage des arcs
+ j=0
+ do
+ j = j+1
+ if (j>sizeTmp) exit
+ if ((.not. tmpTab(j)%cl).or.(.not. tmpTab(j)%keep)) cycle
+ sg = tmpTab(j)%sa
+ if (isEqual(tmpTab(j)%sa%x,tmpTab(j)%sa%dx) .and. &
+ & isEqual(tmpTab(j)%sa%y,tmpTab(j)%sa%dy)) then
+ tmpTab(j)%keep=.false.
+ cycle
+ end if
+ i=0
+ do
+ i = i+1
+ if (i>sizeTmp) exit
+ if (.not. tmpTab(i)%keep) cycle
+ if (tmpTab(i)%sa%typ==tseg) cycle
+ ar=tmpTab(i)%sa
+ nbPtInter = abs(interSgAr(sg,ar,pt1x,pt1y,pt2x,pt2y))
+ if (nbPtInter==2) then
+ !on coupe le segment en trois morceaux
+ tmpTab(j)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ !morceau 1
+ tmpTab(sizeTmp)%sa=sg ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%dx=pt1x ; tmpTab(sizeTmp)%sa%dy=pt1y
+ tmpTab(sizeTmp)%sa%mixg=ar%mixd
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ !morceau 2
+ tmpTab(sizeTmp)%sa=sg ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%x=pt1x ; tmpTab(sizeTmp)%sa%y=pt1y
+ tmpTab(sizeTmp)%sa%dx=pt2x ; tmpTab(sizeTmp)%sa%dy=pt2y
+ tmpTab(sizeTmp)%sa%mixg=ar%mixg
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ !morceau 3
+ tmpTab(sizeTmp)%sa=sg ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%x=pt2x ; tmpTab(sizeTmp)%sa%y=pt2y
+ tmpTab(sizeTmp)%sa%mixg=ar%mixd
+ !on coupe l'arc en 2 morceaux et on n'en garde qu'un
+ tmpTab(i)%keep=.false.
+ if (ar%typ==tcer) then
+ sizeTmp=sizeTmp+1
+ tmpTab(sizeTmp)%sa=ar ; tmpTab(sizeTmp)%cl=.false.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%typ=tarc
+ tmpTab(sizeTmp)%sa%a=calculeAngle(ar%x,ar%y,pt2x,pt2y)
+ tmpTab(sizeTmp)%sa%b=calculeAngle(ar%x,ar%y,pt1x,pt1y)
+ else
+ ! il s'agit ici d'un arc centre sur le segment et le coupant 2
+ ! fois, dans une geometrie symetrique... => a priori,
+ ! cela ne doit jamais arriver
+ call XABORT("G2S : Error, not symetrical geometry")
+ end if
+ exit
+ else if (nbPtInter==1) then
+ !on coupe le segment en deux morceaux
+ tmpTab(j)%keep=.false.
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ !morceau 1
+ tmpTab(sizeTmp)%sa=sg ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%dx=pt1x ; tmpTab(sizeTmp)%sa%dy=pt1y
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ !morceau 2
+ tmpTab(sizeTmp)%sa=sg ; tmpTab(sizeTmp)%cl=.true.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%x=pt1x ; tmpTab(sizeTmp)%sa%y=pt1y
+ !determination des milieux pour les segments selon l'ordre
+ !relatif des points Osg, InterSgAr, Car...
+ !(en fait selon le sens relatif des segments OI et CI)
+ if (((pt1x-sg%x)*(pt1x-ar%x)+(pt1y-sg%y)*(pt1y-ar%y))>0.) then
+ !dans le meme sens => premier segment a l'interieur
+ tmpTab(sizeTmp-1)%sa%mixg=ar%mixg
+ tmpTab(sizeTmp)%sa%mixg=ar%mixd
+ else !=> premier segment a l'exterieur
+ tmpTab(sizeTmp-1)%sa%mixg=ar%mixd
+ tmpTab(sizeTmp)%sa%mixg=ar%mixg
+ end if
+ !on coupe l'arc en 1 ou 2 morceaux et on n'en garde qu'un
+ tmpTab(i)%keep=.false.
+ if (ar%typ==tcer) then
+ sizeTmp=sizeTmp+1
+ ! programmation defensive
+ if (sizeTmp > taille_table_tmpTab) &
+ call XABORT("G2S : memory problem in routine SetBoundCut")
+ tmpTab(sizeTmp)%sa=ar ; tmpTab(sizeTmp)%cl=.false.
+ tmpTab(sizeTmp)%keep=.true.
+ tmpTab(sizeTmp)%sa%typ=tarc
+ angl=calculeAngle(ar%x,ar%y,pt1x,pt1y)
+ if (isPI(angl)) then
+ tmpTab(sizeTmp)%sa%a=-pi_c
+ tmpTab(sizeTmp)%sa%b=pi_c
+ else
+ tmpTab(sizeTmp)%sa%a=angl
+ tmpTab(sizeTmp)%sa%b=angl
+ end if
+ else
+ sizeTmp=sizeTmp+1
+ tmpTab(sizeTmp)%sa=ar ; tmpTab(sizeTmp)%cl=.false.
+ tmpTab(sizeTmp)%keep=.true.
+ !pour savoir quelle partie on garde, on se sert du meme test
+ !que pour les milieux
+ if (((pt1x-sg%x)*(pt1x-ar%x)+(pt1y-sg%y)*(pt1y-ar%y))>0.) then
+ !dans le meme sens => on garde la deuxieme moitie de l'arc
+ tmpTab(sizeTmp)%sa%a=calculeAngle(ar%x,ar%y,pt1x,pt1y)
+ else !=> on garde la premiere moitie de l'arc
+ tmpTab(sizeTmp)%sa%b=calculeAngle(ar%x,ar%y,pt1x,pt1y)
+ end if
+ end if
+ exit
+ else !pas d'intersection mais l'arc est peut-etre a eliminer
+ if (ar%typ/=tarc) cycle
+ call extremitesArc(ar,pt1x,pt1y,pt2x,pt2y)
+ if ( ( estADroiteStrict(sg%x,sg%y,sg%dx,sg%dy,pt1x,pt1y) .or. &
+ & estADroiteStrict(sg%x,sg%y,sg%dx,sg%dy,pt2x,pt2y) ) &
+ & .and. .not. &
+ & ( estAGaucheStrict(sg%x,sg%y,sg%dx,sg%dy,pt1x,pt1y) .or. &
+ & estAGaucheStrict(sg%x,sg%y,sg%dx,sg%dy,pt2x,pt2y) ) ) &
+ & tmpTab(i)%keep=.false.
+ end if
+ end do
+ end do
+ !elimination des segments nuls eventuellement restants
+ do i = 1,sizeTmp
+ sa = tmpTab(i)%sa
+ if (sa%typ==tseg) tmpTab(i)%keep=tmpTab(i)%keep .and. &
+ & .not.(isEqual(tmpTab(i)%sa%x,tmpTab(i)%sa%dx) .and.&
+ & isEqual(tmpTab(i)%sa%y,tmpTab(i)%sa%dy))
+ end do
+ !elimination des segments non de coupe se trouvant sur les segments de
+ ! coupe (ca arrive pour les sectorisations)
+ do j = 1,sizeTmp
+ if (.not.(tmpTab(j)%cl .and. tmpTab(j)%keep)) cycle
+ sa = tmpTab(j)%sa
+ if (sa%typ/=tseg) cycle
+ do i = 1,sizeTmp
+ if (.not. tmpTab(i)%keep .or. tmpTab(i)%cl ) cycle
+ sgi=tmpTab(i)%sa
+ if (sgi%typ/=tseg) cycle
+ if (.not. estColineaire(sa,sgi)) cycle
+ if (.not. pointsAlignes(sa%x,sa%y,sa%dx,sa%dy,sgi%x,sgi%y)) cycle
+ !on renverse le sens de sgi si besoin
+ if (.not. isSameWay(sa,sgi)) sgi=turnBackSide(tmpTab(i)%sa)
+ if (isEqualConst(sa%x,sgi%x).and.isEqualConst(sa%dx,sgi%dx).and. &
+ & isEqualConst(sa%y,sgi%y).and.isEqualConst(sa%dy,sgi%dy)) then
+ tmpTab(j)%sa%mixg=sgi%mixg
+ tmpTab(i)%keep=.false.
+ exit
+ end if
+ end do
+ end do
+ !recopie dans le tableau global des elements a conserver
+ szSA=0
+ ! programmation defensive
+ if (sizeTmp > size(tabSegArc)) &
+ call XABORT("G2S : memory problem in routine SetBoundCut (2)")
+ do i = 1,sizeTmp
+ if (tmpTab(i)%keep) then
+ szSA=szSA+1
+ tabSegArc(szSA)=tmpTab(i)%sa
+ end if
+ end do
+ deallocate(tmpTab)
+ end subroutine setBoundCut
+
+ subroutine prepareSALBCData(szSA,nbCLP)
+ integer,intent(in) :: szSA,nbCLP
+
+ integer :: i,j,k,sunsetType,tmpTabSize,indice
+ logical :: newBC
+ double precision :: basex
+ type(t_segArc) :: sa
+ integer,dimension(:),allocatable :: tmpTabElemNb
+
+ !enregistrement des numeros des differentes conditions limites
+ do i = 1,nbCLP
+ SALbCDataTab(i)%sunsetType = -1
+ sunsetType = 0
+ do j = 1,szSA
+ sa = tabSegArc(j)
+ if (sa%mixg==fooMix .or. sa%mixd==fooMix) then
+ cycle
+ else if (sa%mixg<0) then
+ sunsetType = -sa%mixg
+ else if (sa%mixd<0) then
+ sunsetType = -sa%mixd
+ else
+ cycle
+ end if
+ newBC = .true.
+ do k = 1,i
+ newBC = (newBC .and. (sunsetType /= SALbCDataTab(k)%sunsetType) &
+ & .and. (mod(sunsetType,100) /= B_Void) )
+ end do
+ if (.not. newBC) cycle
+ !on a un type de condition limite non encore pris en compte
+ SALbCDataTab(i)%sunsetType = sunsetType
+ exit
+ end do
+ end do
+ !creation des donnees SAL pour chaque CL
+ do i = 1,nbCLP
+ SALbCDataTab(i)%nber = 0
+ sunsetType = mod(SALbCDataTab(i)%sunsetType,100)
+ indice = SALbCDataTab(i)%sunsetType / 100
+ select case(geomTyp)
+ case(RecTyp)
+ select case(sunsetType)
+ case(B_Refl,B_Ssym)
+ SALbCDataTab(i)%albedo = 1.
+ !SALbCDataTab(i)%SALtype = 1 !ne marche pas pour le moment
+ ! => on passe par une symetrie, mais exterieure
+ SALbCDataTab(i)%SALtype = 4
+ select case(indice)
+ case(1)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ case(2)
+ SALbCDataTab(i)%cx = real(0.5*bCData%sidexy(1)-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ case(3)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 0.
+ case(4)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = real(0.5*bCData%sidexy(2)-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = 0.
+ end select
+ case(B_Tran)
+ SALbCDataTab(i)%SALtype = 2
+ select case(indice)
+ case(1)
+ SALbCDataTab(i)%tx = real(bCData%sidexy(1))
+ SALbCDataTab(i)%ty = 0.
+ case(2)
+ SALbCDataTab(i)%tx = real(-bCData%sidexy(1))
+ SALbCDataTab(i)%ty = 0.
+ case(3)
+ SALbCDataTab(i)%tx = 0.
+ SALbCDataTab(i)%ty = real(bCData%sidexy(2))
+ case(4)
+ SALbCDataTab(i)%tx = 0.
+ SALbCDataTab(i)%ty = real(-bCData%sidexy(2))
+ end select
+ case(B_Diag)
+ SALbCDataTab(i)%SALtype = 4
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 45.
+ case(B_Syme)
+ SALbCDataTab(i)%SALtype = 4
+ select case(indice)
+ case(1)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ case(2)
+ SALbCDataTab(i)%cx = real(bCData%minmaxXY(3)-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ case(3)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 0.
+ case(4)
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = real(bCData%minmaxXY(4)-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = 0.
+ end select
+ case(B_Albe)
+ SALbCDataTab(i)%SALtype = 0
+ SALbCDataTab(i)%albedo = real(bCData%albedo(indice))
+ case(B_Zero)
+ SALbCDataTab(i)%SALtype = 0
+ SALbCDataTab(i)%albedo = 0.
+ case(B_Pi_2)
+ SALbCDataTab(i)%SALtype = 3
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ if (indice==1) then
+ SALbCDataTab(i)%angle = -90.
+ else if (indice==3) then
+ SALbCDataTab(i)%angle = 90.
+ end if
+ case(B_Pi)
+ SALbCDataTab(i)%SALtype = 3
+ SALbCDataTab(i)%cx = real(-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = real(-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = 180.
+ end select
+ case(HexTyp)
+ SALbCDataTab(i)%SALtype = 4
+ if (bCData%iHex==H_Complete) SALbCDataTab(i)%SALtype = 2
+ basex = 0.5d0*bCData%sidexy(1)
+ select case(indice)
+ case(1)
+ if (bCData%iHex==H_S30) then
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 0.
+ else if (bCData%iHex==H_SA60) then
+ SALbCDataTab(i)%cx = real(-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = real(-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = -30.
+ else if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = 0.0
+ SALbCDataTab(i)%ty = real(2.0d0*sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = 0.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(1)")
+ end if
+ case(2)
+ SALbCDataTab(i)%angle = 30.
+ if (bCData%iHex==H_S30) then
+ SALbCDataTab(i)%cx = real(0.5d0*basex)
+ SALbCDataTab(i)%cy = 0.
+ else if (bCData%iHex==H_SA60) then
+ SALbCDataTab(i)%cx = real(-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = real(-bCData%toOrig_xy(2))
+ else if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = real(1.5d0*basex)
+ SALbCDataTab(i)%ty = real(sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = -60.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(2)")
+ end if
+ case(3)
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ if (bCData%iHex==H_S30) then
+ SALbCDataTab(i)%cx = real(.5*sqrt(3.)*bCData%sidexy(2))
+ else if (bCData%iHex==H_SA60) then
+ SALbCDataTab(i)%cx = real(.5*sqrt(3.)*bCData%sidexy(2) &
+ -bCData%toOrig_xy(1))
+ else if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = real(1.5d0*basex)
+ SALbCDataTab(i)%ty = real(-sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = -120.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(3)")
+ end if
+ case(4)
+ if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = 0.0
+ SALbCDataTab(i)%ty = real(-2.0d0*sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = 180.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(4)")
+ end if
+ case(5)
+ if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = real(-1.5d0*basex)
+ SALbCDataTab(i)%ty = real(-sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = 120.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(5)")
+ end if
+ case(6)
+ if (bCData%iHex==H_Complete) then
+ SALbCDataTab(i)%tx = real(-1.5d0*basex)
+ SALbCDataTab(i)%ty = real(sqrt(0.75d0)*basex)
+ SALbCDataTab(i)%angle = 60.0
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(6)")
+ end if
+ end select
+ case(TriaTyp)
+ select case(sunsetType)
+ case(B_Refl)
+ SALbCDataTab(i)%SALtype = 1
+ SALbCDataTab(i)%albedo = 1.
+ case(B_Albe)
+ SALbCDataTab(i)%SALtype = 0
+ SALbCDataTab(i)%albedo = real(bCData%albedo(indice))
+ case(B_Zero)
+ SALbCDataTab(i)%SALtype = 0
+ SALbCDataTab(i)%albedo = 0.
+ case(B_Syme)
+ SALbCDataTab(i)%SALtype = 4
+ select case(indice)
+ case(1)
+ if (bCData%iTri==T_S30) then
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 0.
+ else if (bCData%iTri==T_SA60) then
+ SALbCDataTab(i)%cx = real(-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = real(-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = -30.
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(7)")
+ end if
+ case(2)
+ if (bCData%iTri==T_S30) then
+ SALbCDataTab(i)%cx = 0.
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 30.
+ else if (bCData%iTri==T_SA60) then
+ SALbCDataTab(i)%cx = real(-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = real(-bCData%toOrig_xy(2))
+ SALbCDataTab(i)%angle = 30.
+ else
+ call XABORT("G2S: internal error in prepareSALBCData(8)")
+ end if
+ case(3)
+ SALbCDataTab(i)%cx = real(bCData%minmaxXY(3)-bCData%toOrig_xy(1))
+ SALbCDataTab(i)%cy = 0.
+ SALbCDataTab(i)%angle = 90.
+ end select
+ end select
+ end select
+ end do
+ !remplissage du tableau des indices des segArc concernes par la condition
+ do i = 1,nbCLP
+ sunsetType = SALbCDataTab(i)%sunsetType
+ allocate(tmpTabElemNb(szSA),stat=alloc_ok)
+ if (alloc_ok /= 0) call XABORT("G2S: prepareSALBCData(1) => allocation pb")
+ tmpTabSize = 0
+ do j = 1,szSA
+ sa = tabSegArc(j)
+ if (sa%mixg==-sunsetType .or. sa%mixd==-sunsetType) then
+ tmpTabSize = tmpTabSize + 1
+ tmpTabElemNb(tmpTabSize) = j
+ end if
+ end do
+ SALbCDataTab(i)%nber = tmpTabSize
+ allocate(SALbCDataTab(i)%elemNb(tmpTabSize),stat=alloc_ok)
+ if (alloc_ok /= 0) call XABORT("G2S: prepareSALBCData(2) => allocation pb")
+ do j = 1,tmpTabSize
+ SALbCDataTab(i)%elemNb(j) = tmpTabElemNb(j)
+ end do
+ deallocate(tmpTabElemNb)
+ end do
+ end subroutine prepareSALBCData
+
+ subroutine appliBoundariConditionsForHex(geoIp,szSA,nbCLP)
+ type(c_ptr),intent(in):: geoIp
+ integer,intent(inout) :: szSA
+ integer,intent(out) :: nbCLP
+
+ real,dimension(2) :: tmpTab2
+ real,dimension(6) :: tmpTab6
+ type(c_ptr) :: ip
+ integer :: i,nbCut
+ double precision :: fx,fy,tx,ty,sqrt3_2,x,y,xx,yy,basex
+ double precision :: rayIntCell,rayIntCore,rayExtCell,rayExtCore
+ type(t_segArc) :: sg
+
+ ! programmation defensive
+ integer :: dimTabSegArc
+ !
+ dimTabSegArc = size(tabSegArc)
+
+ ip = geoIp
+ call LCMGET(ip,'NCODE ',bCData%bc)
+ call LCMGET(ip,'ZCODE ',tmpTab6) ; bCData%albedo=tmpTab6
+ call LCMGET(ip,'ICODE ',bCData%albInd)
+ call LCMGET(ip,'IHEX ',bCData%iHex)
+ bCData%sidexy(:)=0.0d0
+ sqrt3_2 = 5.d-1*sqrt(3.d0)
+ nbCut = 0 ; nbCLP = 0
+ rayExtCell = bCData%sidexy(1)
+ rayIntCell = sqrt3_2*rayExtCell
+ rayExtCore = bCData%sidexy(2)
+ rayIntCore = sqrt3_2*rayExtCore
+ select case(bCData%iHex)
+ case(H_S30)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = -rayExtCell ; fy = 0.d0
+ tx = rayIntCore+rayExtCell ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = rayIntCore+sqrt3_2*rayIntCell
+ fy = 5.d-1*(rayExtCore+rayIntCell)
+ tx = 0.d0 ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ if (bCData%bc(1)==B_Syme) then
+ !3
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = rayIntCore ; fy = 0.d0
+ tx = fx ; ty = 5.d-1*rayExtCore
+ sg = createSeg(fx,fy,tx,ty,fooMix,-300-bCData%bc(1))
+ tabSegArc(szSA) = sg
+ end if
+ case(H_SA60)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = -sqrt3_2*rayIntCell
+ fy = 5.d-1*rayIntCell
+ tx = rayIntCore+sqrt3_2*rayIntCell
+ ty = -5.d-1*(rayExtCore+rayIntCell)
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = rayIntCore+sqrt3_2*rayIntCell
+ fy = 5.d-1*(rayExtCore+rayIntCell)
+ tx = 0.d0 ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ if (bCData%bc(1)==B_Syme) then
+ !3
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = rayIntCore ; fy = -5.d-1*rayExtCore
+ tx = fx ; ty = -fy
+ sg = createSeg(fx,fy,tx,ty,fooMix,-300-bCData%bc(1))
+ tabSegArc(szSA) = sg
+ end if
+ case(H_SB60)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = -rayExtCell ; fy = 0.d0
+ tx = rayIntCore+rayExtCell ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = 5.d-1*(rayIntCore+rayExtCell)
+ fy = sqrt3_2*(rayIntCore+rayExtCell)
+ tx = 0.d0 ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ case(H_S90)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = -rayExtCell ; fy = 0.d0
+ tx = rayIntCore+rayExtCell ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = 0.d0 ; fy = rayExtCore+rayIntCell
+ tx = 0.d0 ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ case(H_R120)
+ !!!appliquer les rotations adequat (pas simple)
+ case(H_R180)
+ !!!idem mais plus simple
+ case(H_SA180)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = 0.d0 ; fy = rayExtCore+rayIntCell
+ tx = 0.d0 ; ty = -fy
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ case(H_SB180)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForHex")
+ fx = -rayExtCore-rayIntCell ; fy = 0.d0
+ tx = -fx ; ty = 0.d0
+ sg = createSeg(fx,fy,tx,ty,fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ case(H_Complete)
+ do i=1,6
+ if (bCData%bc(1) == B_Tran) then
+ nbCLP=nbCLP+1
+ call LCMGET(ip,'SIDEXY ',tmpTab2) ; bCData%sidexy=tmpTab2
+ y=0.0d0 ; yy=0.0d0
+ basex = 0.5d0*bCData%sidexy(1)
+ select case(i)
+ case(1)
+ x = -0.5d0*basex
+ y = -sqrt(0.75d0)*basex
+ xx = 0.5d0*basex
+ yy = y
+ case(2)
+ x = -basex
+ xx = -0.5d0*basex
+ yy = -sqrt(0.75d0)*basex
+ case(3)
+ x = -0.5d0*basex
+ y = sqrt(0.75d0)*basex
+ xx = -basex
+ case(4)
+ x = 0.5d0*basex
+ y = sqrt(0.75d0)*basex
+ xx = -0.5d0*basex
+ yy = y
+ case(5)
+ x = basex
+ xx = 0.5d0*basex
+ yy = sqrt(0.75d0)*basex
+ case(6)
+ x = 0.5d0*basex
+ y = -sqrt(0.75d0)*basex
+ xx = basex
+ end select
+ call setBoundSide(x,y,xx,yy,100*i+B_Tran,szSA)
+ endif
+ enddo
+ end select
+ if (nbCut/=0) call setBoundCut(nbCut,szSA)
+ end subroutine appliBoundariConditionsForHex
+
+ subroutine appliBoundariConditionsForTri(geoIp,szSA,nbCLP)
+ type(c_ptr),intent(in):: geoIp
+ integer,intent(inout) :: szSA
+ integer,intent(out) :: nbCLP
+
+ real,dimension(2) :: tmpTab2
+ real,dimension(4) :: tmpTab4
+ real,dimension(6) :: tmpTab6
+ type(c_ptr) :: ip
+ integer :: nbCut,i
+ double precision :: dy
+ type(t_segArc) :: sg
+ integer,dimension(40) :: sv
+ double precision,dimension(4) :: x,y
+
+ ! programmation defensive
+ integer :: dimTabSegArc
+ dimTabSegArc = size(tabSegArc)
+
+ ip = geoIp
+ call LCMGET(ip,'STATE-VECTOR',sv)
+ call LCMGET(ip,'NCODE ',bCData%bc)
+ call LCMGET(ip,'ZCODE ',tmpTab6) ; bCData%albedo=tmpTab6
+ call LCMGET(ip,'ICODE ',bCData%albInd)
+ call LCMGET(ip,'ITRI ',bCData%iTri)
+ call LCMSIX(ip,'NEW-DATA ',1)
+ call LCMSIX(ip,'BOUND-DATA ',1)
+ call LCMGET(ip,'SIDEXY ',tmpTab2) ; bCData%sidexy=tmpTab2
+ call LCMGET(ip,'MINMAXXY ',tmpTab4) ; bCData%minmaxXY=tmpTab4
+
+ nbCut = 0
+ nbCLP = 0
+ select case(bCData%iTri)
+ case(T_S30)
+ !1 (on ne coupe pas car inutile)
+ nbCLP=nbCLP+1
+ call setBoundSide(0.d0,0.d0,bCData%sidexy(2),0.d0,100+B_Syme,szSA)
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForTri")
+ dy = bCData%sidexy(1) * sqrt3_2d
+ if (estPaire(sv(4))) then
+ x(1) = bCData%sidexy(2)
+ y(1) = dy * sv(4)
+ else
+ x(1) = bCData%sidexy(2) - 2.5d-1*bCData%sidexy(1)
+ y(1) = dy * (sv(4) - 5.d-1)
+ end if
+ sg = createSeg(x(1),y(1),0.d0,0.d0,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ if (bCData%bc(1)==B_Syme) then
+ !3
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1 ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForTri")
+
+ if (estPaire(sv(4))) then
+ x(2) = bCData%sidexy(2)
+ y(2) = dy * sv(4)
+ else
+ x(2) = bCData%sidexy(2) - 5.d-1*bCData%sidexy(1)
+ y(2) = dy * (sv(4) - 2.d0/3)
+ end if
+ bCData%minmaxXY(3)=x(2) !stockage de l'abscisse de l'axe de coupe
+ sg = createSeg(x(2),0.d0,x(2),y(2),fooMix,-300-B_Syme)
+ tabSegArc(szSA) = sg
+ end if
+ case(T_SA60)
+ !1
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForTri")
+ dy = bCData%sidexy(1) * sqrt3_2d
+ if (estPaire(sv(4))) then
+ x(1) = bCData%sidexy(2)
+ y(1) = -dy * sv(4)
+ else
+ x(1) = bCData%sidexy(2) - 2.5d-1*bCData%sidexy(1)
+ y(1) = -dy * (sv(4) - 5.d-1)
+ end if
+ sg = createSeg(0.d0,0.d0,x(1),y(1),fooMix,-100-B_Syme)
+ tabSegArc(szSA) = sg
+ !2
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1
+ ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForTri")
+ sg = createSeg(x(1),-y(1),0.d0,0.d0,fooMix,-200-B_Syme)
+ tabSegArc(szSA) = sg
+ if (bCData%bc(1)==B_Syme) then
+ !3
+ nbCut=nbCut+1 ; nbCLP=nbCLP+1
+ szSA=szSA+1 ! programmation defensive
+ if (szSA > dimTabSegArc) call XABORT("G2S: memory problem in routine &
+ &appliBoundaryConditionsForTri")
+ if (estPaire(sv(4))) then
+ x(2) = bCData%sidexy(2)
+ y(2) = dy * sv(4)
+ else
+ x(2) = bCData%sidexy(2) - 5.d-1*bCData%sidexy(1)
+ y(2) = dy * (sv(4) - 2.d0/3)
+ end if
+ bCData%minmaxXY(3)=x(2) !stockage de l'abscisse de l'axe de coupe
+ sg = createSeg(x(2),-y(2),x(2),y(2),fooMix,-300-B_Syme)
+ tabSegArc(szSA) = sg
+ end if
+ case(T_ST60)
+ x(1) = -5.d-1*bCData%sidexy(1) ; x(2) = 0. ; x(3) = -x(1) ; x(4) = x(1)
+ y(1) = sqrt3_2d*x(1) ; y(2) = -y(1) ; y(3) = y(1) ; y(4) = y(1)
+ do i = 1,3
+ if (bCData%bc(i)/= B_Void) nbCLP=nbCLP+1
+ call setBoundSide(x(i+1),y(i+1),x(i),y(i),bCData%bc(i)+100*i,szSA)
+ end do
+ case(T_Complete)
+ y(1) = -5.d-1*bCData%sidexy(2) ; y(2) = y(1)
+ y(3) = -y(1) ; y(4) = y(1)
+ x(1) = -5.d-1*bCData%sidexy(1) ; x(2) = -x(1)
+ x(3) = x(2) + y(3) ; x(4) = x(1) + y(3)
+ call setBoundSide(x(4),y(4),x(1),y(1),bCData%bc(1)+100,szSA)
+ call setBoundSide(x(2),y(2),x(3),y(3),bCData%bc(2)+200,szSA)
+ call setBoundSide(x(1),y(1),x(2),y(2),bCData%bc(3)+300,szSA)
+ call setBoundSide(x(3),y(3),x(4),y(4),bCData%bc(4)+400,szSA)
+ case default
+ call XABORT("G2S: internal error in subroutine &
+ &appliBoundariConditionsForTri")
+ end select
+ if (nbCut/=0) call setBoundCut(nbCut,szSA)
+ end subroutine appliBoundariConditionsForTri
+
+ subroutine appliBoundariConditionsForTub(geoIp,nbCLP)
+ type(c_ptr),intent(in):: geoIp
+ integer,intent(out) :: nbCLP
+
+ real,dimension(6) :: tmpTab6
+
+ nbCLP = 0
+ call LCMGET(geoIp,'NCODE ',bCData%bc)
+ call LCMGET(geoIp,'ZCODE ',tmpTab6) ; bCData%albedo=tmpTab6
+ call LCMGET(geoIp,'ICODE ',bCData%albInd)
+ end subroutine appliBoundariConditionsForTub
+
+end module boundCond