From 7dfcc480ba1e19bd3232349fc733caef94034292 Mon Sep 17 00:00:00 2001 From: stainer_t Date: Mon, 8 Sep 2025 13:48:49 +0200 Subject: Initial commit from Polytechnique Montreal --- Dragon/src/g2s_constUtil.f90 | 292 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 Dragon/src/g2s_constUtil.f90 (limited to 'Dragon/src/g2s_constUtil.f90') diff --git a/Dragon/src/g2s_constUtil.f90 b/Dragon/src/g2s_constUtil.f90 new file mode 100644 index 0000000..8f8d89e --- /dev/null +++ b/Dragon/src/g2s_constUtil.f90 @@ -0,0 +1,292 @@ +! +!----------------------------------------------------------------------- +! +!Purpose: +! Definition of parameter types used in G2S: module. +! +!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: +! De plus, quelques fonctions utilitaires sont aussi definies, telles que : +! - isEqual : teste l'egalite a epsilon pres de deux doubles, et les egalise +! et si leur valeur est proche, les egalise a la moyenne des deux +! - isEqualConst : teste l'egalite a epsilon pres de deux doubles +! - isEqualAngl : teste l'egalite a epsilon pres de deux angles en les +! normalisant si besoin +! - isEqualConstAngl : teste l'egalite a epsilon pres de deux angles normaux +! - angleNormal : retourne la valeur de l'angle centree entre -Pi et Pi +! - distance : calcule la distance entre un point et une droite, et calcule +! les coordonnees de la projection du point sur la droite +! - longVect : calcule la norme d'un vecteur +! - calculeAngle : calcule l'angle d'un vecteur par rapport a Ox +! - estColli : teste la colinearite de deux vecteurs +! - pointsAlignes : teste l'alignement de trois points +! - estAGauche : teste si un point est a gauche d'une droite +! - estAGaucheStrict : teste si un point est strictement a gauche d'une droite +! - estADroite : teste si un point est a droite d'une droite +! - estADroiteStrict : teste si un point est strictement a droite d'une droite +! - isPi : teste l'egalite avec Pi d'un angle +! - estPaire : teste la parite d'un entier +! - isAngleInInterval : teste l'appartenance d'un angle a un domaine angulaire +! +!----------------------------------------------------------------------- +! +module constUtiles + implicit none + + double precision,parameter :: epsilon = 1.d-4 + double precision,parameter :: muleps1 = 5.d0 + double precision,parameter :: muleps2 = 2.d0 + double precision,parameter :: pi_c = 3.14159265358979d0 + double precision,parameter :: pi_2_c = 1.57079632679490d0 + double precision,parameter :: pi_3_c = 1.04719755119660d0 + double precision,parameter :: dpi_c = 6.28318530717959d0 !=2.*pi + double precision,parameter :: rad2deg = 5.72957795130823d1 !=180./pi + double precision,parameter :: deg2rad = 1.74532925199433d-2 !=pi/180. + double precision,parameter :: infinity = 1.d99 + double precision,parameter :: sqrt3_2d = 8.66025403784439d-1 !=sqrt(3)/2 + character*10,parameter :: formatr = '(1p,e18.7)' + character*5,parameter :: formati = '(i6)' + character*21,parameter :: formath = '(3x,4hMACR,i6.6,:,2x)' + real,parameter :: gSALeps = 1e-4 + + ! Numerical Constants + double precision, parameter :: dp_0 = 0.0d0 + double precision, parameter :: dp_1 = 1.0d0 + double precision, parameter :: dp_05 = 0.5d0 + +contains + + logical function isEqual(a,b) + double precision,intent(inout) :: a,b + isEqual = (abs(b-a)pi_c) angleNormal = angleNormal - dpi_c + end function angleNormal + + logical function isEqualConst(a,b) + double precision,intent(in) :: a,b + isEqualConst = (abs(b-a)0.d0).or.pointsAlignes(ox,oy,ex,ey,ptx,pty) + end function estAGauche + + function estAGaucheStrict(ox,oy,ex,ey,ptx,pty) + double precision,intent(in) :: ox,oy,ex,ey,ptx,pty + logical :: estAGaucheStrict + + double precision :: tmp + + tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) + estAGaucheStrict=(tmp>0.d0).and.(.not.pointsAlignes(ox,oy,ex,ey,ptx,pty)) + end function estAGaucheStrict + + function estADroite(ox,oy,ex,ey,ptx,pty) + double precision,intent(in) :: ox,oy,ex,ey,ptx,pty + logical :: estADroite + + double precision :: tmp + + tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) + estADroite=(tmp<0.d0).or.pointsAlignes(ox,oy,ex,ey,ptx,pty) + end function estADroite + + function estADroiteStrict(ox,oy,ex,ey,ptx,pty) + double precision,intent(in) :: ox,oy,ex,ey,ptx,pty + logical :: estADroiteStrict + + double precision :: tmp + + tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) + estADroiteStrict=(tmp<0.d0).and.(.not.pointsAlignes(ox,oy,ex,ey,ptx,pty)) + end function estADroiteStrict + + function isPi(angl) + double precision,intent(in) :: angl + logical :: isPi + + isPi=isEqualConst(abs(angl),pi_c) + end function isPi + + logical function estPaire(n) + integer,intent(in) :: n + estPaire = ((n/2)*2==n) + end function estPaire + + function isAngleInInterval(a,o,e) + double precision,intent(in) :: a,o,e + integer :: isAngleInInterval + !dit si un angle est sur sur l'interval [o,e]: + ! 0 -> pas dessus, + ! 1 -> c'est l'origine, + ! 2 -> entre les deux, + ! 3 -> c'est l'extremite + double precision :: aa,oo,ee + aa = angleNormal(a) ; oo = angleNormal(o) ; ee = angleNormal(e) + if (isEqualConstAngl(oo,aa)) then + isAngleInInterval = 1 + else if (isEqualConstAngl(ee,aa)) then + isAngleInInterval = 3 + else if (oo