Changeset 2808 in Sophya for trunk/SophyaLib/NTools


Ignore:
Timestamp:
Jun 14, 2005, 1:25:05 PM (20 years ago)
Author:
ansari
Message:

MAJ documentation - Reza 14/6/2005

Location:
trunk/SophyaLib/NTools
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/FSAppIrrSmpl.h

    r2322 r2808  
    2525
    2626////////////////////////////////////////////////////////////////////
    27 // Un signal donne , suppose a bande de frequences limitee, de longueur
    28 // finie est periodise. Ce signal periodise est suppose developpe
    29 // en serie de Fourier finie: l'approximation consiste a rechercher
    30 // les coefficients de cette serie de Fourier. Cela est fait en utilisant
    31 // le fait que la matrice du systeme a ecrire est Toeplitz. On utilise
    32 // une classe ToeplitzMatrix, qui utilise les FFT pour la resolution
    33 // L'utilisation standard comporte les etapes suivantes :
    34 //
    35 //   constructeur --> definit l'echantillonnage et l'amplitude
    36 //                    des abscisses (pour periodisation)
    37 //
    38 //   methode approximateSignal(nbFreq, signal) : definit la bande
    39 //                    de frequences et les valeurs du signal
    40 //
    41 //   recuperation de valeurs approximees ou interpolees :
    42 //   methodes:  . restaureSignal() (signal "debruite" aux valeurs
    43 //                                              d'echantionnage)
    44 //              . restaureRegularlySampledSignal() (signal recalcule
    45 //                          sur un echantillonnage regulier quelconque)
    46 //              . computeSignalOnASampling()  (signal recalcule
    47 //                          sur un echantillonnage irregulier quelconque)
    48 //
    49 //  on peut aussi recuperer les valeurs des coefficients du developpement
    50 //  en serie de Fourier (methodes complexFourierCoef() et coeffCosSin()
     27/*!
     28  \ingroup NTools
     29  \class SOPHYA::FSApproximationIrregularSampling
     30  \brief Signal interpolation/approximation using Fourier series with irregularly
     31  sampled data
     32
     33  \verbatim
     34  Un signal donne , suppose a bande de frequences limitee, de longueur
     35  finie est periodise. Ce signal periodise est suppose developpe
     36  en serie de Fourier finie: l'approximation consiste a rechercher
     37  les coefficients de cette serie de Fourier. Cela est fait en utilisant
     38  le fait que la matrice du systeme a ecrire est Toeplitz. On utilise
     39  une classe ToeplitzMatrix, qui utilise les FFT pour la resolution
     40  L'utilisation standard comporte les etapes suivantes :
     41 
     42  constructeur --> definit l'echantillonnage et l'amplitude
     43  des abscisses (pour periodisation)
     44 
     45  methode approximateSignal(nbFreq, signal) : definit la bande
     46  de frequences et les valeurs du signal
     47 
     48  recuperation de valeurs approximees ou interpolees :
     49  methodes:  . restaureSignal() (signal "debruite" aux valeurs
     50  d'echantionnage)
     51  . restaureRegularlySampledSignal() (signal recalcule
     52  sur un echantillonnage regulier quelconque)
     53  . computeSignalOnASampling()  (signal recalcule
     54  sur un echantillonnage irregulier quelconque)
     55 
     56  on peut aussi recuperer les valeurs des coefficients du developpement
     57  en serie de Fourier (methodes complexFourierCoef() et coeffCosSin()
     58
     59  \endverbatim
     60  \sa SOPHYA::ToeplitzMatrix
     61*/
    5162/////////////////////////////////////////////////////////////////////
    5263
    53 
     64namespace SOPHYA {
    5465class FSApproximationIrregularSampling
    5566{
     
    163174};
    164175
     176} // namespace SOPHYA
    165177
    166178#endif
  • trunk/SophyaLib/NTools/cspline.cc

    r2615 r2808  
    1414#include "cspline.h"
    1515
    16 //++
    17 // Class        CSpline
    18 // Lib  Outils++
    19 // include      cspline.h
    20 //
    21 //      Classe de spline 1D
    22 //--
    23 
    24 //++
    25 // Titre        Constructeurs
    26 //--
    27 
    28 //////////////////////////////////////////////////////////////////////////////
    29 //++
     16/*!
     17  \class SOPHYA::CSpline
     18  \ingroup NTools
     19  Spline 3 smoother (interpolator) for 1-D data points (y = f(x))
     20  \sa CSpline2
     21*/
     22
     23/*!
     24  Createur pour spline 3 sur "x[0->n],y[0->n]" avec "yp1,ypn" derivees
     25  au premier et dernier points et "natural" indiquant les types de
     26  contraintes sur les derivees 2sd au premier et dernier point.
     27  "order" doit etre mis a "true" si le tableau de "x[]" n'est pas ordonne
     28  dans l'ordre des "x" croissants ("x[i]<x[i+1]"): cette option
     29  realloue la place pour les tableaux "x,y" autrement seule une
     30  connection aux tableaux "x,y" externes est realisee.
     31*/
    3032CSpline::CSpline(int n,double* x,double* y,double yp1,double ypn
    3133                ,int natural,bool order)
    32 //
    33 //      Createur pour spline 3 sur "x[0->n],y[0->n]" avec "yp1,ypn" derivees
    34 //      au premier et dernier points et "natural" indiquant les types de
    35 //      contraintes sur les derivees 2sd au premier et dernier point.
    36 //      "order" doit etre mis a "true" si le tableau de "x[]" n'est pas ordonne
    37 //      dans l'ordre des "x" croissants ("x[i]<x[i+1]"): cette option
    38 //      realloue la place pour les tableaux "x,y" autrement seule une
    39 //      connection aux tableaux "x,y" externes est realisee.
    40 //--
    4134  : Nel(0), corrupt_Y2(true), XY_Created(false), Natural(natural)
    4235  , YP1(yp1), YPn(ypn), X(NULL), Y(NULL), Y2(NULL), tmp(NULL)
     
    4740}
    4841
    49 //////////////////////////////////////////////////////////////////////////////
    50 //++
     42//!     Createur par defaut.
    5143CSpline::CSpline(double yp1,double ypn,int natural)
    52 //
    53 //      Createur par defaut.
    54 //--
    5544  : Nel(0), corrupt_Y2(true), XY_Created(false), Natural(natural)
    5645  , YP1(yp1), YPn(ypn), X(NULL), Y(NULL), Y2(NULL), tmp(NULL)
     
    5948
    6049//////////////////////////////////////////////////////////////////////////////
     50//! destructeur
    6151CSpline::~CSpline()
    62 // destructeur
    6352{
    6453DelTab();
    6554}
    6655
    67 //++
    68 // Titre        Methodes
    69 //--
    70 
    71 //////////////////////////////////////////////////////////////////////////////
    72 //++
     56/*!
     57  Pour changer les tableaux sans recreer la classe,
     58  memes arguments que dans le createur.
     59  Pour connecter les tableaux "x[n],y[n]" aux pointeurs internes "X,Y"
     60  Si "order=true", on considere que x n'est pas range par ordre
     61  des "x" croissants. La methode alloue de la place pour des tableaux
     62  internes "X,Y" qu'elle re-ordonne par "x" croissant.
     63  "force=true" impose la reallocation des divers buffers, sinon
     64  la reallocation n'a lieu que si le nombre de points augmente.
     65*/
    7366void CSpline::SetNewTab(int n,double* x,double* y,bool order,bool force)
    74 //
    75 //      Pour changer les tableaux sans recreer la classe,
    76 //      memes arguments que dans le createur.
    77 //      Pour connecter les tableaux "x[n],y[n]" aux pointeurs internes "X,Y"
    78 //      Si "order=true", on considere que x n'est pas range par ordre
    79 //      des "x" croissants. La methode alloue de la place pour des tableaux
    80 //      internes "X,Y" qu'elle re-ordonne par "x" croissant.
    81 //      "force=true" impose la reallocation des divers buffers, sinon
    82 //      la reallocation n'a lieu que si le nombre de points augmente.
    83 //--
    8467{
    8568ASSERT( n>3 );
     
    132115
    133116//////////////////////////////////////////////////////////////////////////////
     117//! destruction des divers tableaux en tenant compte des allocations/connections
    134118void CSpline::DelTab()
    135 // destruction des divers tableaux en tenant compte des allocations/connections
    136119{
    137120if( X   != NULL && XY_Created ) delete [] X;    X   = NULL;
     
    142125
    143126//////////////////////////////////////////////////////////////////////////////
    144 //++
     127/*!
     128  Pour changer les valeurs des derivees 1ere au 1er et dernier points
     129  Valeurs imposees des derivees 1ere au points "X[0]" et "X[Nel-1]".
     130*/
    145131void CSpline::SetBound1er(double yp1,double ypn)
    146 //
    147 //      Pour changer les valeurs des derivees 1ere au 1er et dernier points
    148 //      Valeurs imposees des derivees 1ere au points "X[0]" et "X[Nel-1]".
    149 //--
    150132{
    151133if( yp1 == YP1 && ypn == YPn ) return;
     
    157139}
    158140
    159 //////////////////////////////////////////////////////////////////////////////
    160 //++
     141//! Pour calculer les tableaux de coeff permettant le calcul des interpolations spline.
    161142void CSpline::ComputeCSpline()
    162 //
    163 //      Pour calculer les tableaux de coeff permettant le calcul
    164 //      des interpolations spline.
    165 //--
    166143{
    167144// on ne fait rien si les tableaux ne sont pas connectes
     
    206183}
    207184
    208 //////////////////////////////////////////////////////////////////////////////
    209 //++
     185//!     Interpolation spline en \b x
    210186double CSpline::CSplineInt(double x)
    211 //
    212 //      Interpolation spline en "x"
    213 //--
    214187{
    215188int klo,khi,k;
     
    243216}
    244217
    245 ///////////////////////////////////////////////////////////////
    246 ///////// rappel des inlines pour commentaires ////////////////
    247 ///////////////////////////////////////////////////////////////
    248 
    249 //++
    250 // inline void SetNaturalCSpline(int type = NaturalAll)
    251 //      Pour changer le type de contraintes sur les derivees 2sd
    252 //--
    253 //++
    254 // inline void Free_Tmp()
    255 //      Pour liberer la place tampon qui ne sert que
    256 //      dans ComputeCSpline() et pas dans CSplineInt
    257 //--
    258 
    259 //////////////////////////////////////////////////////////////////////////////
    260 //////////////////////////////////////////////////////////////////////////////
    261 
    262 //++
    263 // Class        CSpline2
    264 // Lib  Outils++
    265 // include      cspline.h
    266 //
    267 //      Classe de spline 2D
    268 //--
    269 
    270 //++
    271 // Titre        Constructeurs
    272 //--
    273 
    274 //////////////////////////////////////////////////////////////////////////////
    275 //++
     218
     219//////////////////////////////////////////////////////////////////////////////
     220//////////////////////////////////////////////////////////////////////////////
     221
     222/*!
     223  \class SOPHYA::CSpline2
     224  \ingroup NTools
     225  Spline smoother (interpolator) for 2-D data points (y = f(x1,x2))
     226  \sa CSpline
     227*/
     228
     229/*!
     230  Contructeur - Meme commentaire que pour CSpline avec:
     231  \verbatim
     232  x1[n1]: liste des coordonnees selon l axe 1
     233  x2[n2]: liste des coordonnees selon l axe 2
     234  y[n1*n2]: liste des valeurs avec le rangement suivant
     235  x1[0]......x1[n1-1]  x1[0]......x1[n1-1]  ... x1[0]......x1[n1-1]
     236  |    0<=i<n1      |  |    0<=i<n1      |  ... |    0<=i<n1      |
     237  |      j=0 X2[0]            j=1 X2[1]              j=n2-1 X2[n2-1]
     238  \endverbatim
     239*/
    276240CSpline2::CSpline2(int n1,double* x1,int n2,double* x2,double* y
    277241                  ,int natural,bool order)
    278 //
    279 //      Meme commentaire que pour CSpline avec:
    280 //| x1[n1]: liste des coordonnees selon l axe 1
    281 //| x2[n2]: liste des coordonnees selon l axe 2
    282 //| y[n1*n2]: liste des valeurs avec le rangement suivant
    283 //| x1[0]......x1[n1-1]  x1[0]......x1[n1-1]  ... x1[0]......x1[n1-1]
    284 //| |    0<=i<n1      |  |    0<=i<n1      |  ... |    0<=i<n1      |
    285 //|      j=0 X2[0]            j=1 X2[1]              j=n2-1 X2[n2-1]
    286 //--
    287242  : Nel1(0), Nel2(0), corrupt_Y2(true), XY_Created(false), Natural(natural)
    288243  , X1(NULL), X2(NULL), Y(NULL), Y2(NULL)
     
    294249}
    295250
    296 //////////////////////////////////////////////////////////////////////////////
    297 //++
     251//!     Createur par defaut.
    298252CSpline2::CSpline2(int natural)
    299 //
    300 //      Createur par defaut.
    301 //--
    302253  : Nel1(0), Nel2(0), corrupt_Y2(true), XY_Created(false), Natural(natural)
    303254  , X1(NULL), X2(NULL), Y(NULL), Y2(NULL)
     
    312263}
    313264
    314 //++
    315 // Titre        Methodes
    316 //--
    317 
    318 //////////////////////////////////////////////////////////////////////////////
    319 //++
     265//////////////////////////////////////////////////////////////////////////////
     266//!     Voir commentaire meme methode de CSpline
    320267void CSpline2::SetNewTab(int n1,double* x1,int n2,double* x2,double* y
    321268                        ,bool order,bool force)
    322 //
    323 //      Voir commentaire meme methode de CSpline
    324 //--
    325269{
    326270ASSERT( n1>3 && n2>3 );
     
    430374
    431375//////////////////////////////////////////////////////////////////////////////
    432 //++
     376//!     Voir commentaire meme methode de CSpline
    433377void CSpline2::ComputeCSpline()
    434 //
    435 //      Voir commentaire meme methode de CSpline
    436 //--
    437378{
    438379// on ne fait rien si X1 ou X2 ou Y non connectes
     
    454395
    455396//////////////////////////////////////////////////////////////////////////////
    456 //++
     397//! Calcule la valeur interpole (spline) pour le point \b (x1,x2)
    457398double CSpline2::CSplineInt(double x1,double x2)
    458 //
    459 //      Voir commentaire meme methode de CSpline
    460 //--
    461399{
    462400// calcul de la valeur Y pour x=x1 et remplissage du tampon tmp
     
    471409}
    472410
    473 ///////////////////////////////////////////////////////////////
    474 ///////// rappel des inlines pour commenatires ////////////////
    475 ///////////////////////////////////////////////////////////////
    476 
    477 //++
    478 // inline void SetNaturalCSpline(int type = NaturalAll)
    479 //      Voir commentaire meme methode de CSpline
    480 //--
  • trunk/SophyaLib/NTools/cspline.h

    r896 r2808  
    3131  void SetBound1er(double yp1 = 0.,double yp2 = 0.);
    3232
     33//!  Pour changer le type de contraintes sur les derivees 2sd
    3334  inline void SetNaturalCSpline(int type = NaturalAll)
    3435                 { Natural = type;}
    3536
     37//!  Pour liberer la place tampon qui ne sert que dans ComputeCSpline() et pas dans CSplineInt
    3638  inline void Free_Tmp()
    3739                { if(tmp != NULL) delete [] tmp; tmp=NULL;}
     
    8890                ,bool order=true,bool force=false);
    8991
     92//!  Pour changer le type de contraintes sur les derivees 2sd
    9093  inline void SetNaturalCSpline(int type = CSpline::NaturalAll)
    9194                 { Natural = type;}
  • trunk/SophyaLib/NTools/dates.cc

    r2615 r2808  
    1111#include "dates.h"
    1212
    13 //++
    14 // Class        TimeZone
    15 // Lib          Outils++
    16 // include      dates.h
    17 //
    18 //      Classe de fuseau horaire. Permet les conversion
    19 //      GMT <-> temps local, en gérant les changements
    20 //      d'heure hiver-été.
    21 //      Deux fuseaux horaires sont prédéfinis, "France"
    22 //      et "Chili".
    23 //--
     13/*!
     14  \class TimeZone
     15  \ingroup NTools
     16  Management of time zones - This class is used with class Date.
     17  \warning Unless necessary, DO NOT USE this class.
     18  \sa SOPHYA::TimeStamp
     19
     20  \verbatim
     21 
     22  Classe de fuseau horaire. Permet les conversion
     23  GMT <-> temps local, en gérant les changements
     24  d'heure hiver-été.
     25  Deux fuseaux horaires sont prédéfinis, "France"
     26  et "Chili".
     27  \endverbatim
     28*/
    2429
    2530TimeZone* gTimeZone = NULL;
    2631
    27 //++
    28 // Titre        Constructeurs
    29 //--
    30 
    31 //++
     32
     33/*!     
     34  Constructeur par défaut. Il lit la variable
     35  d'environnement ACQ_TZ pour choisir le fuseau
     36  horaire. Si la variable n'est pas définie, nous
     37  sommes en France...
     38*/ 
    3239TimeZone::TimeZone()
    33 //
    34 //      Constructeur par défaut. Il lit la variable
    35 //      d'environnement ACQ_TZ pour choisir le fuseau
    36 //      horaire. Si la variable n'est pas définie, nous
    37 //      sommes en France...
    38 //--
    3940{
    4041  char* p = getenv("ACQ_TZ");
     
    4748}
    4849
    49 //++
     50//!     Constructeur à partir du nom d'un fuseau horaire.
    5051TimeZone::TimeZone(const char* nom)
    51 //
    52 //      Constructeur à partir du nom d'un fuseau horaire.
    53 //--
    5452{
    5553  SetZone(nom);
    5654}
    5755
    58 //++
     56/*!     
     57  Choisit un fuseau horaire. Contient la définition
     58  du fuseau "France" (GMT+1, DST : dernier dimanche
     59  de mars - dernier dimanche de septembre, c'est-à-dire
     60  pré-gouvernement Juppé), et Chili (GMT-4, DST :
     61  deuxième dimanche d'octobre - deuxième dimanche de mars).
     62*/
    5963void TimeZone::SetZone(const char* nom)
    60 //     
    61 //      Choisit un fuseau horaire. Contient la définition
    62 //      du fuseau "France" (GMT+1, DST : dernier dimanche
    63 //      de mars - dernier dimanche de septembre, c'est-à-dire
    64 //      pré-gouvernement Juppé), et Chili (GMT-4, DST :
    65 //      deuxième dimanche d'octobre - deuxième dimanche de mars).
    66 //--
    6764{
    6865  if (!strcmp(nom,"France")) {
     
    9693}
    9794
    98 //++
     95//!     Teste si une date est en heure d'été (DST).
    9996int TimeZone::IsDst(const Date& date)
    100 //
    101 //      Teste si une date est en heure d'été (DST).
    102 //--
    10397{
    10498  Date dt = date;
     
    139133}
    140134
    141 //++
     135/*!
     136  Retourne la difference TL-GMT pour une date donnée,
     137  en tenant compte de l'heure d'été éventuelle.
     138*/
    142139int TimeZone::GetOffset(const Date& date)
    143 //
    144 //      Retourne la difference TL-GMT pour une date donnée,
    145 //      en tenant compte de l'heure d'été éventuelle.
    146 //--
    147140{
    148141  return IsDst(date) ? gmtOffset+dstOffset : gmtOffset;
    149142}
    150143
    151 //++
    152 // Class        Date
    153 // Lib          Outils++
    154 // include      dates.h
    155 //
    156 //      Une classe date comme une autre, avec gestion
    157 //      temps local / GMT / changement d'heure, et un
    158 //      jour temps sidéral.
    159 //
    160 //      Une partie de la date (heure, jour...) peut être
    161 //      indéterminée. Les comparaisons sont alors faites
    162 //      de façon astucieuse...
    163 //
    164 //      La date peut être déterminée de minuit à minuit
    165 //      ou de midi à midi (nuit d'observation). Logique
    166 //      complexe et peut-être foireuse pour passer de
    167 //      l'un à l'autre, mais pas encore d'ennuis pour le
    168 //      moment... Une date-nuit doit avoir une heure
    169 //      indéterminée.
    170 //
    171 //      Il faut que Date::gTimeZone soit initialisé pour
    172 //      éviter des gros pépins, mais PeidaInit() le fait.
    173 //
    174 //      An 2000 : Lorsqu'on gère des dates sous forme de chaine :
    175 //      * En sortie, 2 caractères pour l'année entre 1950 et 1999
    176 //        et 4 caractères sinon
    177 //      * En entrée, si AA<100 on ajoute 1900.
    178 //--
    179 
    180 //++
     144
     145
     146/*!
     147  \class Date
     148  \ingroup NTools
     149  Date manipulation classe
     150  \warning Unless necessary, DO NOT USE this class.
     151  Use  SOPHYA::TimeStamp instead.
     152
     153  \verbatim
     154 
     155  Une classe date comme une autre, avec gestion
     156  temps local / GMT / changement d'heure, et un
     157  jour temps sidéral.
     158 
     159  Une partie de la date (heure, jour...) peut être
     160  indéterminée. Les comparaisons sont alors faites
     161  de façon astucieuse...
     162 
     163  La date peut être déterminée de minuit à minuit
     164  ou de midi à midi (nuit d'observation). Logique
     165  complexe et peut-être foireuse pour passer de
     166  l'un à l'autre, mais pas encore d'ennuis pour le
     167  moment... Une date-nuit doit avoir une heure
     168  indéterminée.
     169 
     170  Il faut que Date::gTimeZone soit initialisé pour
     171  éviter des gros pépins, mais PeidaInit() le fait.
     172 
     173  An 2000 : Lorsqu'on gère des dates sous forme de chaine :
     174  * En sortie, 2 caractères pour l'année entre 1950 et 1999
     175  et 4 caractères sinon
     176  * En entrée, si AA<100 on ajoute 1900.
     177
     178*/
     179//!     Retourne le nombre de jours dans le mois
    181180short Date::MonthDays(short mois, short annee)
    182 //
    183 //      Retourne le nombre de jours dans le mois
    184 //--
    185181{
    186182  if (mois<1 || mois>12) throw ParmError(PExcLongMessage(""));
     
    206202}
    207203   
    208 //++
     204//!  Retourne le nombre de jours dans l'année
    209205short Date::YearDays(short annee)
    210 //
    211 //      Retourne le nombre de jours dans l'année
    212 //--
    213206{
    214207  return (((annee%4 == 0) && (annee%100 != 0)) || (annee%400 == 0)) ? 366 : 365;
    215208}
    216209
    217 //++
    218210bool Date::UndetDate() const
    219 //
    220 //      Retourne true si une partie de la date (jour
    221 //      ou mois ou année) est indéterminée.
    222 //--
     211/*!
     212  Retourne true si une partie de la date (jour
     213  ou mois ou année) est indéterminée.
     214*/
    223215{
    224216  return ((AA == -1) || (MM == -1) || (JJ == -1));
    225217}
    226218
    227 //++
     219/*!
     220  Retourne true si toute la date (jour
     221  et mois et année) est indéterminée.
     222*/
    228223bool Date::AllUndetDate() const
    229 //
    230 //      Retourne true si toute la date (jour
    231 //      et mois et année) est indéterminée.
    232 //--
    233224{
    234225  return ((AA == -1) && (MM == -1) && (JJ == -1));
    235226}
    236227
    237 //++
    238228bool Date::UndetTime() const
    239 //
    240 //      Retourne true si une partie de l'heure (heure
    241 //      ou minutes ou secondes) est indéterminée.
    242 //--
     229/*!     
     230  Retourne true si une partie de l'heure (heure
     231  ou minutes ou secondes) est indéterminée.
     232*/
    243233{
    244234  return ((hh == -1) || (mm == -1) || (ss == -1));
    245235}
    246236
    247 //++
     237
     238/*!
     239  Retourne true si toute l'heure (heure
     240  et minutes et secondes) est indéterminée.
     241*/
    248242bool Date::AllUndetTime() const
    249 //
    250 //      Retourne true si toute l'heure (heure
    251 //      et minutes et secondes) est indéterminée.
    252 //--
    253243{
    254244  return ((hh == -1) && (mm == -1) && (ss == -1));
     
    257247//Date::operator double() const
    258248
    259 //++
     249//!     Jours écoulés depuis le 0 janvier 1901 0h TU
    260250double
    261251Date::GetDays() const
    262 //
    263 //      Jours écoulés depuis le 0 janvier 1901 0h TU
    264 //--
    265252{
    266253   if (UndetTime() && !AllUndetTime()) throw ParmError(PExcLongMessage(""));
     
    281268}
    282269
    283 //++
     270//!     Initialisation a partir jours écoulés depuis le 0 janvier 1901 0h TU
    284271void Date::Set(double t)
    285 //
    286 //      Jours écoulés depuis le 0 janvier 1901 0h TU
    287 //--
    288272{
    289273   t += 1/8640000.0;
     
    323307   nuit = 0;
    324308}
    325 //++
     309
     310//!     Constructeur. Prend l'heure courante...
    326311Date::Date()
    327 //
    328 //      Constructeur. Prend l'heure courante...
    329 //--
    330312: timeZone(gTimeZone)
    331313{
     
    342324}
    343325
    344 //++
     326//!     Constructeur simple.
    345327Date::Date(int J, int M, int A, int h, int m, double s)
    346 //
    347 //      Constructeur simple.
    348 //--
    349328: JJ(J), MM(M), AA(A), hh(h), mm(m), ss(s), timeZone(gTimeZone), nuit(0)
    350329{
    351330}
    352331
    353 //++
     332//!     Constructeur à partir des jours écoulés depuis le 0 janvier 1901 0h TU
    354333Date::Date(double t)
    355 //
    356 //      Constructeur à partir des
    357 //      jours écoulés depuis le 0 janvier 1901 0h TU
    358 //
    359 //--
    360334: timeZone(gTimeZone)
    361335{
     
    363337}
    364338
    365 //++
     339//!     On change de fuseau horaire.
    366340void Date::SetTimeZone(TimeZone* tz)
    367 //
    368 //      On change de fuseau horaire.
    369 //--
    370341{
    371342  timeZone = tz;
    372343}
    373344
    374 //++
     345/*!
     346  Constructeur à partir de la date sous la forme
     347  'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
     348  (par défaut) ou Date::kLocalTime.
     349*/
    375350Date::Date(const char* date, const char* heure, int tOpt)
    376 //
    377 //      Constructeur à partir de la date sous la forme
    378 //      'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
    379 //      (par défaut) ou Date::kLocalTime.
    380 //
    381 //      Tout ou partie de la date peut être indéterminée ('??').
    382 //--
    383351: timeZone(gTimeZone)
    384352{
     
    386354}
    387355
    388 //++
     356/*!
     357  Constructeur à partir de la date sous la forme
     358  'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
     359  (par défaut) ou Date::kLocalTime.
     360 
     361  Tout ou partie de la date peut être indéterminée ('??').
     362*/
    389363Date::Date(string const& date, string const& heure, int tOpt)
    390 //
    391 //      Constructeur à partir de la date sous la forme
    392 //      'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
    393 //      (par défaut) ou Date::kLocalTime.
    394 //
    395 //      Tout ou partie de la date peut être indéterminée ('??').
    396 //--
    397364: timeZone(gTimeZone)
    398365{
     
    400367}
    401368
    402 //++
     369/*!
     370  Positionne la date sous la forme
     371  'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
     372  (par défaut) ou Date::kLocalTime.
     373 
     374  Tout ou partie de la date peut être indéterminée ('??').
     375*/
    403376void Date::Set(string const& date, string const& heure, int tOpt)
    404 //
    405 //      Positionne la date sous la forme
    406 //      'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
    407 //      (par défaut) ou Date::kLocalTime.
    408 //
    409 //      Tout ou partie de la date peut être indéterminée ('??').
    410 //--
    411377{
    412378  Set(date.c_str(), heure == "" ? (char*)NULL : heure.c_str(), tOpt);
    413379}
    414380
    415 //++
     381/*!
     382  Positionne la date sous la forme
     383  'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
     384  (par défaut) ou Date::kLocalTime.
     385 
     386  Tout ou partie de la date peut être indéterminée ('??').
     387*/
    416388void Date::Set(const char* date, const char* heure, int tOpt)
    417 //
    418 //      Positionne la date sous la forme
    419 //      'DD/MM/YYYY'  'HH/MM/SS', et tOpt est Date::kGMTTime
    420 //      (par défaut) ou Date::kLocalTime.
    421 //
    422 //      Tout ou partie de la date peut être indéterminée ('??').
    423 //--
    424389{
    425390  nuit = 0;
     
    538503}
    539504
    540 //++
     505/*!
     506  Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'
     507  en tOpt = Date::kGMTTime ou Date::kLocalTime.
     508*/
    541509void Date::GetDateStr(char* s, int tOpt) const
    542 //
    543 //      Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'
    544 //      en tOpt = Date::kGMTTime ou Date::kLocalTime.
    545 //--
    546510{
    547511  Date dt(*this);
     
    566530}
    567531
    568 //++
     532//!     Code EROS de la date.
    569533void Date::GetDateCode(char* s, int tOpt) const
    570 //
    571 //      Code EROS de la date.
    572 //--
    573534{
    574535  Date dt(*this);
     
    603564}
    604565
    605 //++
     566//!     Récupère l'heure sous la forme 'HH:MM:SS'
    606567void Date::GetTimeStr(char* s, int tOpt) const
    607 //
    608 //      Récupère l'heure sous la forme 'HH:MM:SS'
    609 //--
    610568{
    611569  Date dt(*this);
     
    624582}
    625583
    626 //++
     584//!     Récupèrera un jour le temps sidéral.
    627585void Date::GetSidTStr(char* s) const
    628 //
    629 //      Récupèrera un jour le temps sidéral.
    630 //--
    631586{
    632587  strcpy(s,"TOBEDONE!!");
    633588}
    634589
    635 //++
    636590string Date::DateStr(int tOpt) const
    637 //
    638 //      Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'
    639 //      en tOpt = Date::kGMTTime ou Date::kLocalTime.
    640 //--
     591/*!
     592  Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'
     593  en tOpt = Date::kGMTTime ou Date::kLocalTime.
     594*/
    641595{
    642596   char s[20];
     
    645599}
    646600
    647 //++
     601//!     Code EROS de la date.
    648602string Date::DateCode(int tOpt) const
    649 //
    650 //      Code EROS de la date.
    651 //--
    652603{
    653604   char s[20];
     
    656607}
    657608
    658 //++
     609//!     Récupère l'heure sous la forme 'HH:MM:SS'
    659610string Date::TimeStr(int tOpt) const
    660 //
    661 //      Récupère l'heure sous la forme 'HH:MM:SS'
    662 //--
    663611{
    664612   char s[20];
     
    667615}
    668616
    669 //++
     617//!     Récupèrera un jour le temps sidéral.
    670618string Date::SidTStr() const
    671 //
    672 //      Récupèrera un jour le temps sidéral.
    673 //--
    674619{
    675620   char s[20];
     
    678623}
    679624
    680 //++
     625//!   Retourne le jour dans la semaine, 0-6 avec 0 = Date::jour_Lundi.
    681626int Date::DayOfWeek(int tOpt) const
    682 //
    683 //      Retourne le jour dans la semaine, 0-6
    684 //      avec 0 = Date::jour_Lundi.
    685 //--
    686627{
    687628  double t = GetDays();
     
    696637}
    697638
    698 //++
     639/*!
     640  Retourne la date correspondant au ieme joursem dans le mois
     641  correspondant (exemple, 2e dimanche de mars 1960).
     642*/
    699643short Date::NthMonthDay(short i, short joursem, short mois, short annee)
    700 //
    701 //      Retourne la date correspondant au ieme joursem dans le mois
    702 //      correspondant (exemple, 2e dimanche de mars 1960).
    703 //--
    704644{
    705645   if (i>0) {
     
    717657}
    718658
    719 //++
     659//! Ajout un nombre \b dt en jours
    720660Date& Date::operator += (double dt)     
    721 //
    722 //      dt en jours
    723 //--
    724661{
    725662  int u = UndetTime();
     
    729666}
    730667
    731 //++
     668//!  retranche un intervalle de temps \b dt en jours
    732669Date& Date::operator -= (double dt)   
    733 //
    734 //      dt en jours
    735 //--
    736670{
    737671  int u = UndetTime();
     
    741675}
    742676
    743 //++
    744677Date operator + (Date const& d, double dt)
    745 //
    746 //--
    747678{
    748679  Date a(d);
     
    751682}
    752683
    753 //++
    754684Date operator - (Date const& d, double dt)
    755 //
    756 //--
    757685{
    758686  Date a(d);
     
    761689}
    762690
    763 //++
     691//!     Résultat en jours
    764692double operator - (Date const& a, Date const& b)
    765 //
    766 //      Résultat en jours
    767 //--
    768693{
    769694  if (a.UndetTime() != b.UndetTime()) throw ParmError(PExcLongMessage(""));
     
    772697}
    773698
    774 //++
     699//!     On n'a pas égalite dès que des éléments déterminés sont différents
    775700bool operator == (Date const& a, Date const& b)
    776 //
    777 //      On n'a pas égalite dès que des éléments déterminés sont différents
    778 //--
    779701{
    780702  if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12)
     
    792714}
    793715
    794 //++
    795716bool operator != (Date const& a, Date const& b)
    796 //
    797 //--
    798717{
    799718  return !(a == b);
    800719}
    801720
    802 //++
     721//!     Inégalité large. Pas de subtilités
    803722bool operator <= (Date const& a, Date const& b)
    804 //
    805 //      Inégalité large. Pas de subtilités
    806 //--
    807723{
    808724  if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12)
     
    838754}
    839755
    840 //++
     756/*!
     757  Inégalité stricte, codée à partir de la large pour résoudre
     758  sans cas particuliers les subtilités
     759  01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95
     760*/
    841761bool operator < (Date const& a, Date const& b)
    842 //
    843 //      Inégalité stricte, codée à partir de la large pour résoudre
    844 //      sans cas particuliers les subtilités
    845 //      01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95
    846 //--
    847762{
    848763  return (a <= b) && !(a == b);
    849764}
    850765
    851 //++
    852766bool operator >= (Date const& a, Date const& b)
    853 //
    854 //--
    855767{
    856768  return (b <= a);
    857769}
    858770
    859 //++
    860771bool operator > (Date const& a, Date const& b)
    861 //
    862 //--
    863772{
    864773  return (b < a);
    865774}
    866775
    867 //++
    868776ostream& operator << (ostream& s, Date const& d)
    869 //
    870 //--
    871777{
    872778  char x[20];
     
    877783  return s;
    878784}
     785
  • trunk/SophyaLib/NTools/dates.h

    r2322 r2808  
    1414
    1515class TimeZone;
    16 // <summary> Dates, conversions, operations </summary>
     16//! Dates, conversions, operations
    1717// Classe generale de date et heure, operation, TU/TL ...
    1818class Date  {
    1919public:
    20   // Enumerations jours et mois
    21   // <group>
     20  //! Enumerations jours et mois
    2221  enum Jour {jour_Lundi=0, jour_Mardi, jour_Mercredi, jour_Jeudi, jour_Vendredi, jour_Samedi, jour_Dimanche};
    2322  enum Mois {mois_Janvier=1, mois_Fevrier, mois_Mars, mois_Avril, mois_Mai, mois_Juin, mois_Juillet,
    2423             mois_Aout, mois_Septembre, mois_Octobre, mois_Novembre, mois_Decembre};
    2524  enum {kGMTTime=0, kLocalTime=1};
    26   // </group> 
    2725
    2826  // Constructeur : maintenant
  • trunk/SophyaLib/NTools/datime.c

    r682 r2808  
    1616
    1717/*       Fonctions de calcule de date et temps (Heure)       */
    18 /*
    19 ++
    20   Module        Dates (C)
    21   Lib   LibsUtil
    22   include       datime.h
    23 
    24         Ce groupe de fonctions permettent de manipuler des dates et heures.
    25         En particulier, il est possible de calculer l'ecart (en nombre de jours
    26         ou de secondes separant deux dates, ou le temps sideral correspondant
    27         a une date et heure legale. Deux structures simples sont definies
    28         afin de faciliter le passage des arguments entre differentes fonctions:
    29         - *JMA* : Jour, Mois, Annee
    30         - *HMS* : Heure, Minutes, Secondes
    31 
    32 --
    33 */
    34 /*
    35 ++
    36   Links Voir aussi:
    37  Temps Sideral, Universel (C)
    38 --
    39 */
    40 /*
    41 ++
    42 Titre   Quelques Macros
    43 --
     18/*!
     19  \ingroup NTools
     20  \file datime.c
     21  \brief Set of C functions and macros to manipulate date and time  + Sidereal time
     22  and simple astronomical functions.
     23
     24  \warning  If possible, use class SOPHYA::TimeStamp in module BaseTools
     25  for date/time computation.
     26
     27  Ce groupe de fonctions permettent de manipuler des dates et heures.
     28  En particulier, il est possible de calculer l'ecart (en nombre de jours
     29  ou de secondes separant deux dates, ou le temps sideral correspondant
     30  a une date et heure legale. Deux structures simples sont definies
     31  afin de faciliter le passage des arguments entre differentes fonctions:
     32  - JMA : Jour, Mois, Annee
     33  - HMS : Heure, Minutes, Secondes
     34
     35  \sa SOPHYA::TimeStamp
    4436*/
    4537
     
    6860--
    6961*/
    70 
     62/*!
     63  \ingroup NTools
     64   Decodage d'une chaine de caracteres "strg" sous forme de "hh:mm:ss 10:43:60.5"
     65   en structure HMS "hms" avec gestion des signes (decodage correcte de -44:30:05.23)
     66*/
    7167void StrtoHMS(char *s,HMS* h)
    7268/* On ne peut pas ecrire 1:-05:-45 pas gere et debile! (mn et sec >=0.)  cmv 12/8/97 */
     
    10197}
    10298
    103 
     99/*!
     100  \ingroup NTools
     101  Ecrit le contenu de la structure HMS "hms" sous forme de "hh:mm:ss" dans la chaine
     102  de caracteres "strg" avec gestion des signes
     103*/
    104104void HMStoStr(HMS h,char *s)
    105105/* L'ecriture est forcee a h:mn:sec avec mn et sec >=0  cmv 12/8/97 */
     
    117117
    118118/* Nouvelle-Fonction */
     119/*!
     120  \ingroup NTools
     121  \brief Retourne le nombre de jours dans le mois m, annee a
     122*/
    119123int NbJourMois(int a, int m)
    120124/* Retourne le nombre de jours dans le mois m, annee a */
     
    130134}
    131135
     136/*!
     137  \ingroup NTools
     138  Calcule le Nombre de jours ecoules depuis 0 Jan 1901.
     139  Si annee < 100  On considere annee = annee+1900  (1900-1999)
     140*/
    132141/* Nouvelle-Fonction */
    133142long JMAtoJ(JMA jma)
    134 /*           Calcule le Nb. de jours ecoules depuis 0 Jan 1901         */
    135 /*   Si annee < 100  On considere annee = annee+1900  (1900-1999)      */
    136 
    137143{
    138144long rc,nban;
     
    162168}
    163169
     170/*!
     171  \ingroup NTools
     172  \brief retourne la date correspondant a \b j jours ecoules depuis le 0/1/1901
     173*/
    164174/* Nouvelle-Fonction */
    165175JMA JtoJMA(long j)
    166 /* retourne la date correspondant a j jours ecoules depuis le 0/1/1901 */
    167176{
    168177long i;
     
    215224}
    216225
     226/*!
     227  \ingroup NTools
     228  \brief Cette fonction calcule le numero de jour de la semaine (Lundi=1 .. Dimanche=7)
     229*/
    217230/* Nouvelle-Fonction */
    218231int NumJour(JMA jma)
    219 /*        Cette fonction calcule le numero de jour de la semaine    */
    220 /*        (Lundi=1 .. Dimanche=7)                                   */
    221 
    222232{
    223233int l;
     
    289299}
    290300
     301/*!
     302  \ingroup NTools
     303  Pour "nj=dd*10+jj", calcule la date correspondant au jour
     304  "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa"
     305  se trouvant apres (ou egal a) la date "dd/mm/aa" .
     306  Si annee "aa" <= 99   ->  annee de 1901 - 1999
     307*/
    291308JMA JApmmaatoJMA(int nj, int mm, int aa)
    292 /*    Pour "nj=dd*10+jj", calcule la date correspondant au jour
    293       "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa"
    294       se trouvant apres (ou egal a) la date "dd/mm/aa" .
    295       Si annee "aa" <= 99   ->  annee de 1901 - 1999       */
    296309{
    297310int i, dd, jj;
     
    311324}
    312325
     326/*!
     327  \ingroup NTools
     328  Cette fonction calcule le nombre d'heures en decimales pour \b hms.
     329  Heures/Minutes/Secondes peuvent etre +/- avec toutes les combinaisons possibles
     330*/
    313331/* Nouvelle-Fonction */
    314332double HMStoH(HMS hms)
     
    321339
    322340
    323 
     341/*!
     342  \ingroup NTools
     343  \brief Conversion en secondes de la structure HMS  "hms"
     344*/
    324345/* Nouvelle-Fonction */
    325346double HMStoSec(HMS hms)
     
    330351}
    331352
     353/*!
     354  \ingroup NTools
     355  Calcule le nombre de secondes correspondant a "date,heure"
     356  a partir de l'origine 1er Janv 1990  0H00 ( Date entre 1930 - 2050 )
     357*/
    332358/* Nouvelle-Fonction */
    333359long DatetoSec(char const* date, char const* heure)
     
    348374}
    349375
     376/*!
     377  \ingroup NTools
     378  Calcule le nombre de secondes correspondant a "date,heure"
     379  a partir de l'origine 1er Janv 1990  0H00 ( Date entre 1930 - 2050 )
     380  en tenant compte des decalages des heures legales.
     381*/
    350382/* Nouvelle-Fonction */
    351383long DatetoSecOff(char const* date, char const* heure)
     
    368400}
    369401
     402/*!
     403  \ingroup NTools
     404  \brief Conversion heures en decimales en structure HMS
     405*/
    370406/* Nouvelle-Fonction */
    371407HMS HtoHMS(double h)
     
    386422}
    387423
     424/*!
     425  \ingroup NTools
     426  Conversion degres decimaux en structure HMS (deg,min,sec)
     427  Degres decimaux en D , M , Sec  Il y a un modulo 360.
     428  la sortie est telle que -180 < deg <= 180.
     429*/
    388430/* Nouvelle-Fonction */
    389431HMS DtoDMS(double h)
    390 /* Degres decimaux en D , M , Sec  Il y a un modulo 360  */
    391 /* la sortie est telle que -180 < deg <= 180. */
    392432{
    393433HMS hms;
     
    408448}
    409449
     450/*!
     451  \ingroup NTools
     452  Conversion degres/heures decimaux en structure HMS (deg/heure,min,sec)
     453  SANS modulo 360/24
     454*/
    410455/* Nouvelle-Fonction */
    411456HMS DoubletoHMS(double h)
     
    875920}
    876921
    877 
     922/*!
     923  \ingroup NTools
     924  \brief Cette fonction  donne le temps sideral moyen a greenwich a 0h UT
     925*/
    878926/* Nouvelle-Fonction  */
    879927HMS GMST_at_0h_UT (JMA date)
     
    925973--
    926974*/
    927 
     975/*!
     976  \ingroup NTools
     977  Cette fonction calcule le temps sideral GMT a partir du temps
     978  universel et de la date GMT.
     979  \verbatim
     980  Temps sideral
     981  Jour Sideral = 86400 Sec. Sid.  ( = 24 H Sid. )   
     982  Annee Solaire = 365 J 5H 48' 46"  =~  365.2422 J                       
     983  Annee Solaire = 365.2422 Jours Solaire Moyen = 366.2422 Jours Sideraux
     984  Jour Sol. Moyem = 24 H Sol. = 24 H Sid. * (366.2422 / 365.2422)       
     985  Jour Solaire Moyen = 86636.555359 Sec. Sid. = 24 H 3' 56.555359"       
     986  Heure Solaire Moyen = 3609.85647 Sec. Sid.                             
     987  Sec. Sol. = 1.0027379 Sec. Sid.                                       
     988  Le 1er Janvier 1989 0H TU Il etait 6H 42' 30" GMT_Sideral
     989  \endverbatim
     990*/
    928991/* Nouvelle-Fonction  */
    929992HMS TUtoTSid(JMA date, HMS TU)
     
    9641027}
    9651028
     1029/*!
     1030  \ingroup NTools
     1031  Cette fonction calcule les temps universels a partir du temps
     1032  sideral GMT et de la date GMT. Selon la valeur du TS, il peut y avoir
     1033  une ou deux possibilites pour le TU (return code).
     1034*/
    9661035/* Nouvelle-Fonction  */
    9671036int TSidtoTU(JMA date, HMS TS, HMS *TU1, HMS *TU2)
     
    10271096}
    10281097
    1029 /*
    1030 ++
    1031 void TSidSetupLaSilla()
    1032         Fonction d'initialisation de conversion  de temps sideral et legal
    1033         pour la ESO-Silla "SetTSolMOff() , SetTLegOff()".
    1034 |       Longitude = 70 deg 43.8 min ouest
    1035 |       Latitude  = 29 deg 15.4 min Sud   
    1036 |       T Sol. Moyen - TU = -4.715333 Heures
    1037 |       TLegal-TU : -4 Heures de Mars a Octobre, -3 Heures sinon
    1038 |       Changement le 1er dimanche >= 8/03  8/10 a midi (12:00:00)
    1039 --
    1040 */
    1041 
     1098/*!
     1099  \ingroup NTools
     1100  Fonction d'initialisation de conversion  de temps sideral et legal
     1101  pour la ESO-Silla "SetTSolMOff() , SetTLegOff()".
     1102  \verbatim
     1103  Longitude = 70 deg 43.8 min ouest
     1104  Latitude  = 29 deg 15.4 min Sud   
     1105  T Sol. Moyen - TU = -4.715333 Heures
     1106  TLegal-TU : -4 Heures de Mars a Octobre, -3 Heures sinon
     1107  Changement le 1er dimanche >= 8/03  8/10 a midi (12:00:00)
     1108  \endverbatim
     1109*/
    10421110/* Fonction d'initialisation de calcul de temps sideral pour la Silla */
    10431111void TSidSetupLaSilla()
     
    10531121
    10541122
    1055 /*
    1056 ++
    1057 double ToJulianDay(JMA dateTU, HMS hmsTU);
    1058         Calcul du jour Julien pour une date TU.
    1059         Uniquement valable a partir du 15/10/1582 00:00:00.
    1060 --
    1061 */
    1062 
     1123/*!
     1124  \ingroup NTools
     1125  Calcul du jour Julien pour une date TU.
     1126  Uniquement valable a partir du 15/10/1582 00:00:00.
     1127 
     1128*/
    10631129double ToJulianDay(JMA dateTU, HMS hmsTU)
    10641130/* Cf Fundamental astronomie, Springer Verlag 2sd ed.  cmv 4/12/98 */
     
    10741140}
    10751141
    1076 /*
    1077 ++
    1078 int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU);
    1079         Calcul de la date date et l'heure TU a partir d'un jour Julien.
    1080         Retourne 0 si succes.
    1081 --
    1082 */
    1083 
     1142/*!
     1143  \ingroup NTools
     1144  Calcul de la date date et l'heure TU a partir d'un jour Julien.
     1145  Retourne 0 si succes.
     1146*/
    10841147int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU)
    10851148/* Cf Fundamental astronomie, Springer Verlag 2sd ed.  cmv 4/12/98 */
     
    11151178
    11161179
    1117 /*
    1118 ++
    1119 double StrgtoDegDec(char *strg)
    1120         Cette fonction renvoie la valeur decimale en heures
    1121         d'un angle specifie sous forme de [-][+]dd:mm:ss.
    1122 --
    1123 */
    1124 
     1180/*!
     1181  \ingroup NTools
     1182  Cette fonction renvoie la valeur decimale en heures
     1183  d'un angle specifie sous forme de [-][+]dd:mm:ss.
     1184*/
    11251185double StrgtoDegDec(char *strg)
    11261186/*         cmv 4/12/98 */
     
    11431203}
    11441204
    1145 /*
    1146 ++
    1147 char * DegDectoStrg(double deg, char *strg)
    1148         Cette fonction ecrit une valeur en degre decimal sous
    1149         forme de [-]dd:mm:ss.
    1150 --
     1205/*!
     1206  \ingroup NTools
     1207  Cette fonction ecrit une valeur en degre decimal sous
     1208  forme de [-]dd:mm:ss.
    11511209*/
    11521210
     
    11721230}
    11731231
    1174 /*
    1175 ++
    1176 double EccEarth(JMA dateTU)
    1177         Valeur de l'eccentricite de l'orbite terrestre
    1178         a la date TU ``dateTU''.
    1179 --
     1232/*!
     1233  \ingroup NTools
     1234  Valeur de l'eccentricite de l'orbite terrestre
     1235  a la date TU ``dateTU''.
     1236  Cf Fundamental astronomie, Springer Verlag 2sd ed p477 table E10
    11801237*/
    11811238double EccEarth(JMA dateTU)
     
    11911248}
    11921249
    1193 /*
    1194 ++
    1195 double ObliqEarth(JMA dateTU)
    1196         Valeur de l'obliquite de l'orbite terrestre
    1197         a la date TU ``dateTU'' (en degres decimaux).
    1198 --
     1250/*!
     1251  \ingroup NTools
     1252  Valeur de l'obliquite de l'orbite terrestre
     1253  a la date TU ``dateTU'' (en degres decimaux).
    11991254*/
    12001255double ObliqEarth(JMA dateTU)
     
    12091264}
    12101265
    1211 /*
    1212 ++
    1213 double LongEcPerihelie(JMA dateTU)
    1214         Retourne la Longitude Ecliptique du perihelie de
    1215         l'orbite terrestre a la date TU ``dateTU'' (en degres decimaux).
    1216 --
     1266/*!
     1267  \ingroup NTools
     1268  Retourne la Longitude Ecliptique du perihelie de
     1269  l'orbite terrestre a la date TU ``dateTU'' (en degres decimaux).
    12171270*/
    12181271double LongEcPerihelie(JMA dateTU)
     
    12291282}
    12301283
    1231 /*
    1232 ++
    1233 void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU);
    1234         Renvoie les coordonnees ecliptiques ``l,b'' a partir de
    1235         coordonnees equatoriales ``a,d'' a la date TU ``dateTU''.
    1236         La date permet de corriger la variation annuelle
    1237         de l'obliquite terrestre.
    1238 --
     1284/*!
     1285  \ingroup NTools
     1286  Renvoie les coordonnees ecliptiques \b (l,b) a partir de
     1287  coordonnees equatoriales \b (a,d) a la date TU \b dateTU.
     1288  La date permet de corriger la variation annuelle
     1289  de l'obliquite terrestre.
    12391290*/
    12401291void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU)
  • trunk/SophyaLib/NTools/datime.h

    r220 r2808  
    1010
    1111
     12/*!
     13  \ingroup NTools
     14  \file datime.h
     15  Set of C functions and macros to manipulate date and time + Sidereal time.
     16  \sa datime.c
     17  \warning : If possible, use class SOPHYA::TimeStamp
     18*/
     19/*!
     20  \ingroup NTools
     21  \brief Structure JMA pour representer une date (Jour, Mois Annee) */
    1222typedef struct
    1323  {
     
    1727  }  JMA ;
    1828
    19 
     29/*!
     30  \ingroup NTools
     31  \brief Structure HMS pour representer une heure (Heure, Minute Seconde)
     32*/
    2033typedef struct
    2134  {
     
    2538  } HMS ;
    2639
     40/* \cond
    2741/*   ----------    2) Donnees constantes  ---------- */
    2842#ifdef  DATIMEPRIVEE
     
    4357#endif
    4458
     59/* \endcond */
    4560/*    ------ 3) Macro de manipulation de date et heure  -------  */
    46 
    4761#define  NomJour(d)      (NomJo[NumJour(d)-1])
    4862#define  NomMois(d)      (NomMo[d.Mois-1])
    4963
    50 /*   Chaine de forme  hh:mm:sec  <->  structure HMS   */
     64/*        Chaine de forme  hh:mm:sec  <->  structure HMS   */
     65/*! \brief  Decodage de Chaine de forme  hh:mm:sec   ->  structure HMS   */
    5166#define  StrgtoHMS(s,h)  ( sscanf(s,"%d:%d:%lf", &(h.Heures),&(h.Minutes),&(h.Secondes)) )
     67/*! \brief  structure HMS -> Chaine de forme  hh:mm:sec  */
    5268#define  HMStoStrg(h,s)  ( sprintf(s,"%02d:%02d:%02.0f", h.Heures,h.Minutes,h.Secondes) )
    5369
     
    5571/* EA 140998, machin infame pour que ca marche pour 1998/09/14... Pourquoi avoir fait */
    5672/* des macros ??????????????????????????????????????????????????????????????????????? */
     73/*!  \brief Chaine de caracteres sous forme de dd/mm/aaaa -> structure JMA jma. */
    5774#define  StrgtoJMA(strg,j)  ( sscanf(strg,"%d/%d/%d", &(j.Jour),&(j.Mois),&(j.Annee)),\
    5875    (j.Jour>1900 ? sscanf(strg,"%d/%d/%d", &(j.Annee),&(j.Mois),&(j.Jour)) : 1) )
    59 
     76/*! \brief structure JMA -> Chaine de forme jj/mm/aa       */
    6077#define  JMAtoStrg(j,strg)  ( sprintf(strg,"%02d/%02d/%4d", j.Jour,j.Mois,j.Annee) )
     78/*! \brief structure JMA -> Chaine de forme jj/mm/aa       */
    6179#define  JMAtoStrgLong(j,strg)   ( sprintf(strg,"%s , %d %s %d", NomJo[NumJour(j)-1], j.Jour, NomMo[j.Mois-1], j.Annee) )
    6280
  • trunk/SophyaLib/NTools/difeq.cc

    r2615 r2808  
    33#include "ctimer.h"
    44
    5 //++
    6 // Class        DiffEqSolver
    7 // Lib          Outils++
    8 // include      difeq.h
    9 //
    10 //      Classe abstraite de résolveur d'équation différentielles.
    11 //      Beaucoup de méthodes renvoient l'objet afin de pouvoir
    12 //      utiliser une notation chaînée du type
    13 //|     s.Step(...).Start(...).Solve(...)
    14 //--
    15 //++
    16 // Links        Implementations
    17 // RK4DiffEq
    18 // RK4CDiffEq
    19 //--
    20 
    21 //++
    22 // Titre        Constructeurs
    23 //--
    24 
    25 //++
     5/*!
     6  \ingroup NTools
     7  \class SOPHYA::DiffEqSolver
     8  \brief Classe abstraite de résolveur d'équation différentielles.
     9
     10  Beaucoup de méthodes renvoient l'objet afin de pouvoir
     11  utiliser une notation chaînée du type:
     12
     13  s.Step(...).Start(...).Solve(...)
     14
     15  \warning statut EXPERIMENTAL , NON TESTE
     16
     17  \sa SOPHYA::DiffEqFunction
     18  \sa SOPHYA::RK4DiffEq  SOPHYA::RK4CDiffEq
     19*/
     20
     21//!     Constructeur vide.
    2622DiffEqSolver::DiffEqSolver()
    27 //
    28 //      Constructeur vide.
    29 //--
    3023: mFunc(NULL), mOwnFunc(false),
    3124  mYStart(1), mXStart(0), mStep(0.01)
    3225{}
    3326
    34 //++
     27//!  Constructeur général. L'équation est donnée sous forme de DiffEqFunction
    3528DiffEqSolver::DiffEqSolver(DiffEqFunction* f)
    36 //
    37 //      Constructeur général. L'équation est donnée sous forme
    38 //      de DiffEqFunction
    39 //--
    4029: mFunc(f), mOwnFunc(false),
    4130  mYStart(mFunc->NFuncReal()), mXStart(0), mStep(0.01)
    4231{}
    4332
    44 //++
     33/*!
     34  Constructeur pour le cas particulier d'une équation du premier
     35  ordre. Voir DiffEqFcn1. La fonction f correspond à l'équation
     36  y' = f(y).
     37*/
    4538DiffEqSolver::DiffEqSolver(DIFEQFCN1 f)
    46 //
    47 //      Constructeur pour le cas particulier d'une équation du premier
    48 //      ordre. Voir DiffEqFcn1. La fonction f correspond à l'équation
    49 //      y' = f(y).
    50 //--
    5139: mFunc(new DiffEqFcn1(f)), mOwnFunc(true),
    5240  mYStart(mFunc->NFuncReal()), mXStart(0), mStep(0.01)
     
    5846}
    5947
    60 //++
    61 // Titre        Méthodes
    62 //--
    63 
    64 //++
     48
     49/*!
     50  Permet de spécifier l'équation différentielle, sous la forme
     51  d'une DiffEqFunction. Retourne l'objet DiffEqSolver : notation
     52  chaînée possible
     53*/
    6554DiffEqSolver&
    6655DiffEqSolver::Func(DiffEqFunction* f)
    67 //
    68 //      Permet de spécifier l'équation différentielle, sous la forme
    69 //      d'une DiffEqFunction. Retourne l'objet DiffEqSolver : notation
    70 //      chaînée possible
    71 //--
    7256{
    7357  if (mFunc && mOwnFunc) delete mFunc;
     
    7761}
    7862
    79 //++
     63/*!
     64  Permet de spécifier l'équation différentielle, sous la forme
     65  d'une fonction f telle que y' = f(y). Retourne l'objet DiffEqSolver :
     66  notation chaînée possible.
     67*/
    8068DiffEqSolver&
    8169DiffEqSolver::Func(DIFEQFCN1 f)
    82 //
    83 //      Permet de spécifier l'équation différentielle, sous la forme
    84 //      d'une fonction f telle que y' = f(y). Retourne l'objet DiffEqSolver :
    85 //      notation chaînée possible.
    86 //--
    8770{
    8871  if (mFunc && mOwnFunc) delete mFunc;
     
    9275}
    9376
    94 //++
     77/*!
     78  Spécifie le pas d'intégration de l'équation différentielle (pour
     79  les méthodes où ce pas a un sens). La valeur par défaut est 0.01.
     80  Retourne l'objet DiffEqSolver : notation chaînée possible.
     81*/
    9582DiffEqSolver&
    9683DiffEqSolver::Step(double step)
    97 //
    98 //      Spécifie le pas d'intégration de l'équation différentielle (pour
    99 //      les méthodes où ce pas a un sens). La valeur par défaut est 0.01.
    100 //      Retourne l'objet DiffEqSolver : notation chaînée possible.
    101 //--
    10284{
    10385  mStep = step;
     
    10587}
    10688
    107 //++
     89
     90/*!
     91  Spécifie le point de départ de l'intégration de l'équadif.
     92  Le vecteur \b y contient les valeurs intiales. Voir la description
     93  de chaque fonction-objet-équation différentielle pour connaître
     94  le rôle de chaque élément du vecteur. \b t est la valeur initiale
     95  du temps.
     96  La dimension de y doit correspondre au nombre apparent de fonctions.
     97  Retourne l'objet DiffEqSolver : notation chaînée possible.
     98*/
    10899DiffEqSolver&
    109100DiffEqSolver::StartV(Vector const& yi, double t)
    110 //
    111 //      Spécifie le point de départ de l'intégration de l'équadif.
    112 //      Le vecteur y contient les valeurs intiales. Voir la description
    113 //      de chaque fonction-objet-équation différentielle pour connaître
    114 //      le rôle de chaque élément du vecteur. t est la valeur initiale
    115 //      du temps.
    116 //      La dimension de y doit correspondre au nombre apparent de fonctions.
    117 //      Retourne l'objet DiffEqSolver : notation chaînée possible.
    118 //--
    119101{
    120102  ASSERT(mFunc != NULL);
     
    127109}
    128110
    129 //++
     111/*! 
     112  Spécifie le point de départ de l'intégration de l'équadif,
     113  pour une équation y' = f(y). On donne le temps et la valeur de y.
     114  Retourne l'objet DiffEqSolver : notation chaînée possible.
     115*/
    130116DiffEqSolver&
    131117DiffEqSolver::Start1(double y, double t)
    132 //
    133 //      Spécifie le point de départ de l'intégration de l'équadif,
    134 //      pour une équation y' = f(y). On donne le temps et la valeur de y.
    135 //      Retourne l'objet DiffEqSolver : notation chaînée possible.
    136 //--
    137118{
    138119  ASSERT(mFunc != NULL);
     
    146127}
    147128
    148 //++
     129
     130/*!
     131  Spécifie le point de départ de l'intégration de l'équadif.
     132  Le tableau \b yi contient les valeurs intiales. Voir la description
     133  de chaque fonction-objet-équation différentielle pour connaître
     134  le rôle de chaque élément du tableau. t est la valeur initiale
     135  du temps.
     136  Le nombre d'éléments de yi doit correspondre au nombre apparent
     137  de fonctions.
     138  Retourne l'objet DiffEqSolver : notation chaînée possible.
     139*/
    149140DiffEqSolver&
    150141DiffEqSolver::Start(double const* yi, double t)
    151 //
    152 //      Spécifie le point de départ de l'intégration de l'équadif.
    153 //      Le tableau yi contient les valeurs intiales. Voir la description
    154 //      de chaque fonction-objet-équation différentielle pour connaître
    155 //      le rôle de chaque élément du tableau. t est la valeur initiale
    156 //      du temps.
    157 //      Le nombre d'éléments de yi doit correspondre au nombre apparent
    158 //      de fonctions.
    159 //      Retourne l'objet DiffEqSolver : notation chaînée possible.
    160 //--
    161142{
    162143  mYStart.Realloc(mFunc->NFunc());
     
    169150}
    170151
    171 //++
    172 // virtual void DiffEqSolver::SolveArr(Matrix&  y, double* t, double tf, int n)=0
    173 //      Lance la résolution de l'équadif, jusqu'à la valeur
    174 //      tf du temps. N valeurs intermédiaires sont retournées dans
    175 //      les tableaux y et t :
    176 //      t[i] est le temps au pas i, pour 0<=i<n
    177 //      y[i] sont les valeurs des fonctions au pas i.
    178 //      Voir la description
    179 //      de chaque fonction-objet-équation différentielle pour connaître
    180 //      le rôle de chaque élément de y[i].
    181 //      t[n-1] vaut tf.
    182 //      Le nombre d'éléments de y[i] doit correspondre au nombre apparent
    183 //      de fonctions.
    184 //      Cette fonction doit être redéfinie pour chaque méthode de résolution
    185 //      d'équations. Elle est appelée par toutes les autres fonctions de
    186 //      résolution (autres SolveArr, et Solve).
    187 //--
    188 
    189 
    190 //++
     152/*!
     153  \fn virtual void DiffEqSolver::SolveArr(Matrix&  y, double* t, double tf, int n)
     154
     155  Lance la résolution de l'équadif, jusqu'à la valeur
     156  tf du temps. N valeurs intermédiaires sont retournées dans
     157  les tableaux y et t :
     158  - t[i] est le temps au pas i, pour 0<=i<n
     159  - y[i] sont les valeurs des fonctions au pas i.
     160
     161  Voir la description   
     162  de chaque fonction-objet-équation différentielle pour connaître
     163  le rôle de chaque élément de y[i].
     164  t[n-1] vaut tf.
     165  Le nombre d'éléments de y[i] doit correspondre au nombre apparent
     166  de fonctions.
     167  Cette fonction doit être redéfinie pour chaque méthode de résolution
     168  d'équations. Elle est appelée par toutes les autres fonctions de
     169  résolution (autres SolveArr, et Solve).
     170*/
     171
     172
     173/*!
     174  Lance la résolution de l'équadif, jusqu'à la valeur
     175  tf du temps. Les valeurs finales sont retournées dans yf.
     176  Voir la description
     177  de chaque fonction-objet-équation différentielle pour connaître
     178  le rôle de chaque élément de yf.
     179  Le nombre d'éléments de yf doit correspondre au nombre apparent
     180  de fonctions.
     181*/
    191182void
    192183DiffEqSolver::SolveV(Vector& yf, double tf)
    193 //
    194 //      Lance la résolution de l'équadif, jusqu'à la valeur
    195 //      tf du temps. Les valeurs finales sont retournées dans yf.
    196 //      Voir la description
    197 //      de chaque fonction-objet-équation différentielle pour connaître
    198 //      le rôle de chaque élément de yf.
    199 //      Le nombre d'éléments de yf doit correspondre au nombre apparent
    200 //      de fonctions.
    201 //--
    202184{
    203185  double t;
     
    209191}
    210192
    211 //++
     193
     194/*!
     195  Lance la résolution de l'équadif, jusqu'à la valeur
     196  tf du temps, pour une équation du premier ordre y' = f(y).
     197  La valeur finale de y est retournée dans yf.
     198*/
    212199void
    213200DiffEqSolver::Solve1(double& yf, double tf)
    214 //
    215 //      Lance la résolution de l'équadif, jusqu'à la valeur
    216 //      tf du temps, pour une équation du premier ordre y' = f(y).
    217 //      La valeur finale de y est retournée dans yf.
    218 //--
    219201{
    220202  ASSERT(mFunc->NFunc() == 1);
     
    225207}
    226208
    227 //++
     209
     210/*!
     211  Lance la résolution de l'équadif, jusqu'à la valeur   
     212  tf du temps. Les valeurs finales sont retournées dans yf.
     213  Voir la description
     214  de chaque fonction-objet-équation différentielle pour connaître
     215  le rôle de chaque élément de yf.
     216  Le nombre d'éléments de yf doit correspondre au nombre apparent
     217  de fonctions.
     218*/
    228219void
    229220DiffEqSolver::Solve(double* yf, double tf)
    230 //
    231 //      Lance la résolution de l'équadif, jusqu'à la valeur
    232 //      tf du temps. Les valeurs finales sont retournées dans yf.
    233 //      Voir la description
    234 //      de chaque fonction-objet-équation différentielle pour connaître
    235 //      le rôle de chaque élément de yf.
    236 //      Le nombre d'éléments de yf doit correspondre au nombre apparent
    237 //      de fonctions.
    238 //--
    239221{
    240222  double t;
     
    245227}
    246228
    247 //++
     229/*!
     230  Lance la résolution de l'équadif (du premier ordre), jusqu'à la valeur
     231  tf du temps. N valeurs intermediaires sont retournées dans
     232  les tableaux y et t :
     233  t[i] est le temps au pas i, pour 0<=i<n
     234  y[i] est la valeur de la fonction au pas i.
     235  t[n-1] vaut tf.
     236*/
    248237void
    249238DiffEqSolver::SolveArr1(double*  y, double* t, double tf, int n)
    250 //
    251 //      Lance la résolution de l'équadif (du premier ordre), jusqu'à la valeur
    252 //      tf du temps. N valeurs intermediaires sont retournées dans
    253 //      les tableaux y et t :
    254 //      t[i] est le temps au pas i, pour 0<=i<n
    255 //      y[i] est la valeur de la fonction au pas i.
    256 //      t[n-1] vaut tf.
    257 //--
    258239
    259240{
     
    265246}
    266247
    267 //++
     248/*!
     249  Lance la résolution de l'équadif, jusqu'à la valeur
     250  tf du temps. N valeurs intermédiaires sont retournées dans
     251  les tableaux y et t :
     252  t[i] est le temps au pas i, pour 0<=i<n
     253  y[i] sont les valeurs des fonctions au pas i.
     254  Voir la description
     255  de chaque fonction-objet-équation différentielle pour connaître
     256  le rôle de chaque élément de y[i].
     257  t[n-1] vaut tf.
     258  Le nombre d'éléments de y[i] doit correspondre au nombre apparent
     259  de fonctions.
     260*/
    268261void
    269262DiffEqSolver::SolveArr2(double** y, double* t, double tf, int n)
    270 //
    271 //      Lance la résolution de l'équadif, jusqu'à la valeur
    272 //      tf du temps. N valeurs intermédiaires sont retournées dans
    273 //      les tableaux y et t :
    274 //      t[i] est le temps au pas i, pour 0<=i<n
    275 //      y[i] sont les valeurs des fonctions au pas i.
    276 //      Voir la description
    277 //      de chaque fonction-objet-équation différentielle pour connaître
    278 //      le rôle de chaque élément de y[i].
    279 //      t[n-1] vaut tf.
    280 //      Le nombre d'éléments de y[i] doit correspondre au nombre apparent
    281 //      de fonctions.
    282 //--
    283263{
    284264   Matrix m(n, mFunc->NFuncReal());
     
    290270
    291271
    292 //++
    293 // Class        DiffEqFunction
    294 // Lib  Outils++
    295 // include      difeq.h
    296 //
    297 //      Classe de fonctions pour la résolution d'équations différentielles.
    298 //      On résoud de facon générale un système de n équations différentielles
    299 //      du premier ordre, donnant les dérivées fpi de n fonctions fi.
    300 //      Cette méthode permet de résoudre toutes les sortes d'équations :
    301 //      pour une équation du second ordre on crée une fonction intermédiaire
    302 //      qui est la dérivée de la fonction cherchée.
    303 //--
    304 
    305 //++
    306 // DiffEqFunction::DiffEqFunction(int n)
    307 //      Constructeur. N est le nombre de fonctions dans le
    308 //      système.
    309 //--
    310 
    311 //++
    312 // DiffEqFunction::DiffEqFunction(int n, int napp)
    313 //      Constructeur. N est le nombre réel de fonctions dans le
    314 //      système, et napp le nombre apparent (pour l'utilisateur).
    315 //      En effet, dans certains cas, on peut avoir besoin de fonctions
    316 //      supplémentaires masquées à l'utilisateur, par exemple la fonction
    317 //      constante valant 1, si l'équadif fait intervenir le temps (t).
    318 //--
    319 
    320 //++
    321 //  virtual void ComputeV(Vector& fpi, Vector const& fi)
    322 //      Calcule les valeurs des dérivées fpi à partir des valeurs
    323 //      des fonctions fi. A redéfinir.
    324 //--
    325 
    326 //++
    327 //  virtual void Compute(double& fp, double f)
    328 //      Dans le cas où il y a une seule fonction, calcule la dérivée
    329 //      fp à partir de la valeur de la fonction f. A redéfinir.
    330 //--
    331 
    332 //++
    333 // int NFunc()
    334 //      Nombre apparent de fonctions dans le système
    335 //--
    336  
    337 //++
    338 // int NFuncReal() {return mNFunc;}
    339 //      Nombre réel de fonctions dans le système
    340 //--
     272/*!
     273  \ingroup NTools
     274  \class SOPHYA::DiffEqFunction
     275 
     276  \brief Classe de fonctions pour la résolution d'équations différentielles.
     277 
     278  On résoud de facon générale un système de n équations différentielles
     279  du premier ordre, donnant les dérivées fpi de n fonctions fi.
     280  Cette méthode permet de résoudre toutes les sortes d'équations :
     281  pour une équation du second ordre on crée une fonction intermédiaire
     282  qui est la dérivée de la fonction cherchée.
     283
     284  \warning statut EXPERIMENTAL , NON TESTE
     285
     286  \sa SOPHYA::DiffEqSolver
     287*/
     288
     289
     290
     291/*!
     292  \fn DiffEqFunction::DiffEqFunction(int n, int napp)
     293  Constructeur. N est le nombre réel de fonctions dans le
     294  système, et napp le nombre apparent (pour l'utilisateur).
     295  En effet, dans certains cas, on peut avoir besoin de fonctions
     296  supplémentaires masquées à l'utilisateur, par exemple la fonction
     297  constante valant 1, si l'équadif fait intervenir le temps (t).
     298*/
     299
     300/*!
     301  \fn virtual void ComputeV(Vector& fpi, Vector const& fi)
     302  Calcule les valeurs des dérivées fpi à partir des valeurs
     303  des fonctions fi. A redéfinir.
     304*/
     305
     306/*!
     307  \fn virtual void Compute(double& fp, double f)
     308  Dans le cas où il y a une seule fonction, calcule la dérivée
     309  fp à partir de la valeur de la fonction f. A redéfinir.
     310*/
     311
    341312
    342313//++
     
    348319
    349320
    350 //++
    351 // Class        DiffEqFcn1
    352 // Lib  Outils++
    353 // include      difeq.h
    354 //
    355 //      Objet-fonction générique pour la résolution d'équations
    356 //      différentielles de la forme y' = f(y).
    357 //      On fournit une fonction de type
    358 //|     typedef double(*DIFEQFCN1)(double);
    359 //      qui retourne y' en fonction de y.
    360 //--
    361 //++
    362 // Links        Parents
    363 // DiffEqFunction
    364 //--
    365 
    366 //++
     321/*!
     322  \ingroup NTools
     323  \class SOPHYA::DiffEqFcn1
     324 
     325  \brief Objet-fonction générique pour la résolution d'équations
     326  différentielles de la forme y' = f(y).
     327 
     328  On fournit une fonction de type <br>
     329  <tt> typedef double(*DIFEQFCN1)(double); </tt> <br>
     330  qui retourne y' en fonction de y.
     331
     332  \warning statut EXPERIMENTAL , NON TESTE
     333*/
     334
     335
     336//!     Constructeur. On fournit la fonction f tq y'=f(y)
    367337DiffEqFcn1::DiffEqFcn1(DIFEQFCN1 fcn)
    368 //
    369 //      Constructeur. On fournit la fonction f tq y'=f(y)
    370 //--
    371338: DiffEqFunction(1), mFcn(fcn)
    372339{}
    373340
     341
     342//! Implementation de Compute qui va utiliser la fonction fournie au constructeur.
    374343void
    375344DiffEqFcn1::Compute(double& fp, double f)
     
    378347}
    379348
    380 //++
    381 // Class        DiffEqFcnT1
    382 // Lib  Outils++
    383 // include      difeq.h
    384 //
    385 //      Objet-fonction générique pour la résolution d'équations
    386 //      différentielles de la forme y' = f(y,t).
    387 //      On fournit une fonction de type
    388 //|     typedef double(*DIFEQFCNT1)(double, double);
    389 //      qui retourne y' en fonction de y et t.
    390 //      Note : le système résolu est alors en fait
    391 //|     y'[0] = fcn(y[0], y[1])
    392 //|     y'[1] = 1
    393 //--
    394 //++
    395 // Links        Parents
    396 // DiffEqFunction
    397 //--
    398 
    399 //++
     349/*!
     350  \ingroup NTools
     351  \class   SOPHYA::DiffEqFcnT1
     352
     353  Objet-fonction générique pour la résolution d'équations
     354  différentielles de la forme y' = f(y,t).
     355  On fournit une fonction de type
     356  <tt>  typedef \tt double(*DIFEQFCNT1)(double, double); </tt>
     357  qui retourne y' en fonction de y et t.
     358
     359  \verbatim
     360  Note : le système résolu est alors en fait
     361  y'[0] = fcn(y[0], y[1])
     362  y'[1] = 1
     363  \endverbatim
     364
     365  \warning statut EXPERIMENTAL , NON TESTE
     366*/
     367
     368//! Constructeur. On fournit la fonction f tq y' = f(y,t)
    400369DiffEqFcnT1::DiffEqFcnT1(DIFEQFCNT1 fcn)
    401 //
    402 //      Constructeur. On fournit la fonction f tq y' = f(y,t)
    403 //--
    404370: DiffEqFunction(2, 1), mFcn(fcn)
    405371{}
     
    419385}
    420386
    421 //++
    422 // Class        DiffEqFcn2
    423 // Lib  Outils++
    424 // include      difeq.h
    425 //
    426 //      Objet-fonction générique pour la résolution d'équations
    427 //      différentielles de la forme y'' = f(y',y).
    428 //      On fournit une fonction de type
    429 //|     typedef double(*DIFEQFCN2)(double, double);
    430 //      qui retourne y'' en fonction de y' et y.
    431 //      Note : le système résolu est en fait
    432 //|     y'[0] = y[1]
    433 //|     y'[1] = f(y[1], y[0])
    434 //--
    435 //++
    436 // Links        Parents
    437 // DiffEqFunction
    438 //--
    439 
    440 //++
     387/*!
     388  \ingroup NTools
     389  \class   SOPHYA::DiffEqFcn2
     390 
     391  Objet-fonction générique pour la résolution d'équations
     392  différentielles de la forme y'' = f(y',y).
     393  On fournit une fonction de type
     394  <tt>  typedef double(*DIFEQFCN2)(double, double); </tt>
     395  qui retourne y'' en fonction de y' et y.
     396  \verbatim
     397  Note : le système résolu est en fait
     398  y'[0] = y[1]
     399  y'[1] = f(y[1], y[0])
     400  \endverbatim
     401
     402  \warning statut EXPERIMENTAL , NON TESTE
     403*/
     404
     405//!   Constructeur. On fournit la fonction f tq y''=f(y',y)
    441406DiffEqFcn2::DiffEqFcn2(DIFEQFCN2 fcn)
    442 //
    443 //      Constructeur. On fournit la fonction f tq y''=f(y',y)
    444 //--
    445407: DiffEqFunction(2), mFcn(fcn)
    446408{}
     
    453415}
    454416
    455 //++
    456 // Class        DiffEqFcnT2
    457 // Lib  Outils++
    458 // include      difeq.h
    459 //
    460 //      Objet-fonction générique pour la résolution d'équations
    461 //      différentielles de la forme y'' = f(y',y,t).
    462 //      On fournit une fonction de type
    463 //|     typedef double(*DIFEQFCNT2)(double, double, double);
    464 //      qui retourne y'' en fonction de y', y et t.
    465 //      Note : le système résolu est alors en fait
    466 //|     y'[0] = y[1]
    467 //|     y'[1] = f(y[1], y[0], y[2])
    468 //|     y'[2] = 1
    469 //--
    470 //++
    471 // Links        Parents
    472 // DiffEqFunction
    473 //--
    474 
    475 //++
     417/*!
     418  \ingroup NTools
     419  \class SOPHYA::DiffEqFcnT2
     420 
     421  Objet-fonction générique pour la résolution d'équations
     422  différentielles de la forme y'' = f(y',y,t).
     423  On fournit une fonction de type <br>
     424  <tt> typedef double(*DIFEQFCNT2)(double, double, double); </tt> <br>
     425  qui retourne y'' en fonction de y', y et t.
     426  \verbatim
     427  Note : le système résolu est alors en fait
     428  y'[0] = y[1]
     429  y'[1] = f(y[1], y[0], y[2])
     430  y'[2] = 1
     431  \endverbatim
     432
     433  \warning statut EXPERIMENTAL , NON TESTE
     434*/
     435
     436//!     Constructeur. On fournit la fonction f tq y'' = f(y',y,t)
    476437DiffEqFcnT2::DiffEqFcnT2(DIFEQFCNT2 fcn)
    477 //
    478 //      Constructeur. On fournit la fonction f tq y'' = f(y',y,t)
    479 //--
    480438: DiffEqFunction(3,2), mFcn(fcn)
    481439{}
     
    497455
    498456
    499 //++
    500 // Class        DiffEqFcnV
    501 // Lib  Outils++
    502 // include      difeq.h
    503 //
    504 //      Objet-fonction générique pour la résolution d'équations
    505 //      différentielles 3D de la forme y'' = f(y',y), ou y est
    506 //      un vecteur de dimension 3.
    507 //      On fournit une fonction de type
    508 //|     typedef void(*DIFEQFCNV)(Vector& y2, Vector const& y1,
    509 //|                              Vector const& y);
    510 //      qui retourne y'' en fonction de y' et y.
    511 //      Note : le système résolu est alors en fait
    512 //|     v(0-2) = y, v(3-5) = y'
    513 //|
    514 //|     v'[0] = v[3]
    515 //|     v'[1] = v[4]
    516 //|     v'[2] = v[5]
    517 //|     v'[3-5] = f(v[3-5], v[0-2])
    518 //--
    519 //++
    520 // Links        Parents
    521 // DiffEqFunction
    522 //--
     457/*!
     458  \ingroup NTools
     459  \class  SOPHYA::DiffEqFcnV
     460 
     461  Objet-fonction générique pour la résolution d'équations
     462  différentielles 3D de la forme y'' = f(y',y), ou y est
     463  un vecteur de dimension 3.
     464  On fournit une fonction de type <br>
     465  <tt> typedef void(*DIFEQFCNV)(Vector& y2, Vector const& y1, <br>
     466  Vector const& y); </tt> <br>
     467  qui retourne y'' en fonction de y' et y.
     468  \verbatim
     469  Note : le système résolu est alors en fait
     470  v(0-2) = y, v(3-5) = y'
     471
     472  v'[0] = v[3]
     473  v'[1] = v[4]
     474  v'[2] = v[5]
     475  v'[3-5] = f(v[3-5], v[0-2])
     476  \endverbatim
     477
     478  \warning statut EXPERIMENTAL , NON TESTE
     479*/
    523480
    524481DiffEqFcnV::DiffEqFcnV(DIFEQFCNV fcn)
     
    543500
    544501
    545 //++
    546 // Class        RK4DiffEq
    547 // Lib          Outils++
    548 // include      difeq.h
    549 //
    550 //      Classe de résolution d'équadif par la méthode de
    551 //      Runge-Kutta d'ordre 4.
    552 //      Voir DiffEqSolver pour les méthodes.
    553 //--
    554 //++
    555 // Links        Parents
    556 // DiffEqSolver
    557 //--
    558 
    559 //++
    560 // Titre        Constructeurs
    561 //--
     502/*!
     503  \ingroup NTools
     504  \class SOPHYA::RK4DiffEq
     505 
     506  Classe de résolution d'équadif par la méthode de
     507  Runge-Kutta d'ordre 4.
     508  Voir DiffEqSolver pour les méthodes.
     509
     510  \warning statut EXPERIMENTAL , NON TESTE
     511*/
    562512
    563513RK4DiffEq::RK4DiffEq()
     
    565515{}
    566516
    567 //++
     517//!     Constructeur général
    568518RK4DiffEq::RK4DiffEq(DiffEqFunction* f)
    569 //
    570 //      Constructeur général
    571 //--
    572519: DiffEqSolver(f), k1(f->NFuncReal()),
    573520  k2(f->NFuncReal()), k3(f->NFuncReal()), k4(f->NFuncReal())
    574521{}
    575522
    576 //++
     523
     524//!     Constructeur pour y' = f(y)
    577525RK4DiffEq::RK4DiffEq(DIFEQFCN1 f)
    578 //
    579 //      Constructeur pour y' = f(y)
    580 //--
    581526: DiffEqSolver(f), k1(1), k2(1), k3(1), k4(1)
    582527{}
  • trunk/SophyaLib/NTools/difeq.h

    r1371 r2808  
    2121class DiffEqFunction  {
    2222public:
    23   // Constructeur. n = nombre de fonctions dans le systeme
     23  //! Constructeur. n = nombre de fonctions dans le systeme
    2424  DiffEqFunction(int n)          : mNFunc(n), mNFuncApp(n) {}
    2525 
    26   // Constructeur. n = nombre reel de fonctions dans le systeme,
    27   // m = nombre apparent (il y a dans certaines cas des fonctions a
    28   // usage interne,  par exemple la fonction constante valant 1...)
    29  
     26   
     27  //  Constructeur. n = nombre reel de fonctions dans le systeme,
     28  //  m = nombre apparent (il y a dans certaines cas des fonctions a
     29  //  usage interne,  par exemple la fonction constante valant 1....
    3030  DiffEqFunction(int n, int m)   : mNFunc(n), mNFuncApp(m) {}
    3131 
     
    4242       { ASSERT(mNFunc == 1); }
    4343 
    44   // Nombre apparent de fonctions dans le systeme
     44  //! Nombre apparent de fonctions dans le systeme
    4545  int NFunc()     {return mNFuncApp;}
    4646 
    47   // Nombre reel de fonctions dans le systeme
     47  //! Nombre reel de fonctions dans le systeme
    4848  int NFuncReal() {return mNFunc;}
    4949 
    50   // Pour ajuster vecteur de depart quand il y a des fonctions a usage
    51   // interne...
     50  //! Pour ajuster vecteur de depart quand il y a des fonctions a usage v  interne...
    5251  virtual void AdjustStart(Vector& /*start*/, double /*tstart*/)
    5352    {}   
     
    6867class DiffEqFcn1 : public DiffEqFunction {
    6968public:
    70   // Constructeur, on fournit une fonction double->double
     69  // Constructeur, on fournit une fonction double->double 
    7170  // qui donne y' en fonction de y.
    7271  DiffEqFcn1(DIFEQFCN1);
    7372
    74   // Implementation de Compute qui va utiliser la fonction fournie
    75   // au constructeur.
     73  // Implementation de Compute qui va utiliser la fonction
     74  // fournie au constructeur.
    7675  virtual void Compute(double& fp, double f);
    7776protected:
  • trunk/SophyaLib/NTools/dynccd.cc

    r2615 r2808  
    1111#include "dynccd.h"
    1212
    13 //++
    14 // Class        DynCCD
    15 // Lib          Images++
    16 // include      dynccd.h
    17 //
    18 //      Cette classe permet la specification des parametres
    19 //      definissant la dynamique du CCD, et doit etre utilise
    20 //      pour le calcul des images de bruit.
    21 //      - TypNoise = 1 :
    22 //      Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain )     
    23 //      - TypNoise = 2 :                                     
    24 //      Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) 
    25 //      - TypNoise = 0
    26 //      Bruit = 1  (Constant pour tous les pixels)
    27 //      - TypNoise = 3         
    28 //      Bruit = Sqrt(Abs(ValPix))
    29 //
    30 //      Les pixels hors dynamique sont marques (Bruit = 0)
    31 //      ( < MinADU ou > MaxADU) pour toutes valeurs de TypNoise.
    32 //      Gain est exprime en electron par ADU, RONoise en electron,
    33 //      Bruit, ValPix et RefFond en ADU.
    34 //--
     13/*!
     14  \class SOPHYA::DynCCD
     15  \ingroup NTools
     16 
     17  Cette classe permet la specification des parametres
     18  definissant la dynamique du CCD, et doit etre utilise
     19  pour le calcul des images de bruit.
    3520
    36 //++
    37 // Links        Parents
    38 // PPersist
    39 //--
    40 //++
    41 // Links        Autres
    42 // RzImage
    43 // Image<T>
    44 //--
    45 //++
    46 // Titre        Methodes
    47 //--
    48 //++
    49 // DynCCD(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.);
    50 //      Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit)
    51 //      |Test verbatim
    52 //
    53 // void Set(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.);
    54 //      Modification des parametres de la dynamique
    55 // void Print()
    56 // r_8 Noise(r_8 pixel) const
    57 //      Renvoie la valeur du bruit pour "pixel" en ADU.
    58 //--
     21  - TypNoise = 1
     22  Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain )     
     23  - TypNoise = 2 :                                     
     24  Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) 
     25  - TypNoise = 0
     26  Bruit = 1  (Constant pour tous les pixels)
     27  - TypNoise = 3         
     28  Bruit = Sqrt(Abs(ValPix))
     29 
     30  Les pixels hors dynamique sont marques (Bruit = 0)
     31  ( < MinADU ou > MaxADU) pour toutes valeurs de TypNoise.
     32  Gain est exprime en electron par ADU, RONoise en electron,
     33  Bruit, ValPix et RefFond en ADU.
     34
     35  \sa SOPHYA::Image
     36*/
     37
    5938
    6039/* ............................................................ */
     
    6342
    6443/* --Methode-- */
     44//!  Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit)
    6545DynCCD::DynCCD(int_4 typ, r_8 min, r_8 max, r_8 g,
    6646               r_8 ron, r_8 rf, r_8 rfs)
     
    7454
    7555/* --Methode-- */
     56//!     Modification des parametres de la dynamique
    7657void DynCCD::Set(int_4 typ, r_8 min, r_8 max, r_8 g,
    7758               r_8 ron, r_8 rf, r_8 rfs)
     
    9374}
    9475
     76//!     Renvoie la valeur du bruit pour "pixel" en ADU.
     77/*!
     78  Cette fonction calcule la valeur du bruit pour pixel
     79  - Si TypNoise = 1 :                                 
     80  Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain )     
     81  - Si TypNoise = 2 :                                 
     82  Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain )
     83  - Si TypNoise = 0                                       
     84  Bruit = 1  (Constant pour tous les pixels)         
     85  - Si TypNoise = 3                                       
     86  Bruit = Sqrt(Abs(PixelADU))                       
     87
     88  Les pixels hors dynamique sont marques (Bruit = 0)   
     89  ( < MinADU ou > MaxADU) pour tout valeur de TypNoise 
     90*/
    9591/* --Methode-- */
    9692r_8 DynCCD::Noise(r_8 pixel) const
    97 
    98 /* Cette fonction calcule la valeur du bruit pour pixel     */
    99 /*  Si TypNoise = 1 :                                       */
    100 /*     Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain )      */
    101 /*  Si TypNoise = 2 :                                       */
    102 /*     Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain )  */
    103 /*  Si TypNoise = 0                                         */
    104 /*     Bruit = 1  (Constant pour tous les pixels)           */
    105 /*  Si TypNoise = 3                                         */
    106 /*     Bruit = Sqrt(Abs(PixelADU))                          */
    107 /*  Les pixels hors dynamique sont marques (Bruit = 0)      */
    108 /*  ( < MinADU ou > MaxADU) pour tout valeur de TypNoise    */
    109 
    11093{
    11194r_8 h,s,ronsq;
     
    133116/* --------------------------------------------------------------  */
    134117
    135 //++
    136 // Module       Images de bruit
    137 // Lib          Images++
    138 // include      dynccd.h
    139 //
    140 //      Ces fonctions permettent le calcul d'image de bruit a partir d'une
    141 //      image (RzImage ou Image<T>) et d'un objet DynCCD
    142 //--
    143 //++
    144 // Links        Voir classes
    145 // DynCCD
    146 // RzImage
    147 // Image<T>
    148 //--
    149 //++
    150 // Titre        Les fonctions
    151 //--
    152 
    153 //++
    154 // Function     RzImage * NoiseImage(RzImage const *pim, DynCCD const * dynccd)
    155 //      Construit et renvoie l'image du bruit pour l'image "*pim" (RzImage)
    156 // Function     Image<T> * NoiseImage(Image<T> const * pim, DynCCD const * dynccd)
    157 //      Meme fonctionalite pour une image typee (ImageU2, ImageR4, ...)
    158 // Function     ImgAddNoise(Image<T>&, DynCCD const&)
    159 //      Calcule l'image du bruit et le rajoute a l'image originale
    160 //--
    161118
    162119/* Nouvelle-Fonction */
     120/*!
     121  Construit et renvoie l'image du bruit pour l'image "*pim"
     122 
     123  Creation et Calcul d'une image de bruit a partir de l'image
     124  pim et de dynccd. Voir la methode DynCCD::Noise() pour la
     125  description du calcul                                       
     126*/
    163127template <class T>
    164128Image<T> NoiseImage(Image<T> const & pim, DynCCD const & dynccd)
    165 
    166 /* Creation et Calcul d'une image de bruit a partir de l'image */
    167 /* pim et de dynccd. Voir la methode DynCCD::Noise() pour la   */
    168 /* description du calcul                                       */
    169129
    170130{
     
    190150
    191151/* Nouvelle-Fonction */
     152//!     Calcule l'image du bruit et le rajoute a l'image originale
    192153template <class T>
    193154void ImgAddNoise(Image<T>& img, DynCCD const& dyn)
     155
    194156{
    195157  int_4 nPix = img.XSize() * img.YSize();
  • trunk/SophyaLib/NTools/dynccd.h

    r1110 r2808  
    1111namespace SOPHYA {
    1212
    13 enum {kConstantNoise = 0, kPhotonNoise, kSigFondNoise, kSqrtADUNoise};
    1413
     14//! Readout and photon noise calculation for images
    1515class DynCCD
    1616{
    1717  public :
     18  enum {kConstantNoise = 0, kPhotonNoise, kSigFondNoise, kSqrtADUNoise};
    1819
    1920  int_4 TypNoise;      // Type de calcul du bruit
     
    3738
    3839
     40//! Return an image corresponding to the noise described by \b dynccd
    3941template <class T>
    4042Image<T> NoiseImage(Image<T> const & pim, DynCCD const & dynccd);
    4143
     44//! Add noise to the image
    4245template <class T>
    4346void ImgAddNoise(Image<T>&, DynCCD const&);
  • trunk/SophyaLib/NTools/integ.cc

    r2615 r2808  
    1010//     utilisant le (1)
    1111
    12 //++
    13 // Class        Integrator
    14 // Lib          Outils++
    15 // include      integ.h
    16 //
    17 //      Classe abstraite d'intégration numérique 1D.
    18 //      On fournit une fonction double f(double) au constructeur, ou
    19 //      une GeneralFunction avec des paramètres définis.
    20 //      L'objet Integrator est convertible en valeur double qui est la valeur
    21 //      de l'intégrale. Diverses méthodes permettent de choisir des options
    22 //      de calcul, et ces méthodes retournent une référence sur l'objet, pour
    23 //      permettre une notation chaînée.
    24 //--
    25 //++
    26 // Links        Implementations
    27 // TrpzInteg
    28 // GLInteg
    29 //--
    30 
    31 //++
    32 // Titre        Constructeurs
    33 //--
    34 
    35 //++
     12/*!
     13  \ingroup NTools
     14  \class SOPHYA::Integrator
     15
     16  \brief Classe abstraite d'intégration numérique 1D.
     17
     18  On fournit une fonction double f(double) au constructeur, ou
     19  une GeneralFunction avec des paramètres définis.
     20  L'objet Integrator est convertible en valeur double qui est la valeur
     21  de l'intégrale. Diverses méthodes permettent de choisir des options
     22  de calcul, et ces méthodes retournent une référence sur l'objet, pour
     23  permettre une notation chaînée.
     24
     25  \sa TrpzInteg GLInteg
     26*/
     27
     28//!  Constructeur par défaut. L'objet n'est pas utilisable en l'état.
    3629Integrator::Integrator()
    37 //
    38 //      Constructeur par défaut. L'objet n'est pas utilisable en l'état.
    39 //--
    40 
    4130: mFunc(NULL), mGFF(NULL), mGFFParm(NULL),
    4231  mNStep(50), mDX(-1), mReqPrec(-1),
     
    4433{}
    4534
    46 //++
     35//! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    4736Integrator::Integrator(FUNC f, double xmin, double xmax)
    48 //
    49 //      Constructeur à partir de la fonction double->double, et des
    50 //      bornes d'intégration.
    51 //--
    5237: mFunc(f), mGFF(NULL), mGFFParm(NULL),
    5338  mNStep(50), mDX(-1), mReqPrec(-1),
     
    5540{}
    5641
     42//! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    5743Integrator::Integrator(fun f, double xmin, double xmax)
    58 //
    59 //      Constructeur à partir de la fonction double->double, et des
    60 //      bornes d'intégration.
    61 //--
    6244: mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
    6345  mNStep(50), mDX(-1), mReqPrec(-1),
     
    6648
    6749
    68 //++
     50/*!
     51  Constructeur sans spécifier les bornes. Elles sont positionnées
     52  à [0,1], et on pourra les modifier plus tard.
     53*/
    6954Integrator::Integrator(FUNC f)
    70 //
    71 //      Constructeur sans spécifier les bornes. Elles sont positionnées
    72 //      à [0,1], et on pourra les modifier plus tard.
    73 //--
    7455: mFunc(f), mGFF(NULL), mGFFParm(NULL),
    7556  mNStep(50), mDX(-1), mReqPrec(-1),
     
    7758{}
    7859
    79 //++
     60/*!
     61  Constructeur sans spécifier les bornes. Elles sont positionnées
     62  à [0,1], et on pourra les modifier plus tard.
     63*/
    8064Integrator::Integrator(fun f)
    81 //
    82 //      Constructeur sans spécifier les bornes. Elles sont positionnées
    83 //      à [0,1], et on pourra les modifier plus tard.
    84 //--
    8565: mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
    8666  mNStep(50), mDX(-1), mReqPrec(-1),
     
    8868{}
    8969
    90 //++
     70/*!
     71  Constructeur à partir d'une GeneralFunction. La fonction doit être une
     72  fonction de une variable, et on fournit les valeurs des paramètres ainsi
     73  que les bornes d'intégration.
     74*/
    9175Integrator::Integrator(GeneralFunction* gff, double* par, double xmin, double xmax)
    92 //
    93 //      Constructeur à partir d'une GeneralFunction. La fonction doit être une
    94 //      fonction de une variable, et on fournit les valeurs des paramètres ainsi
    95 //      que les bornes d'intégration.
    96 //--
    9776: mFunc(NULL), mGFF(gff), mGFFParm(par),
    9877  mNStep(50), mDX(-1), mReqPrec(-1),
     
    10281}
    10382
    104 //++
     83/*!
     84  Constructeur à partir d'une GeneralFunction. La fonction doit être une
     85  fonction de une variable, et on fournit les valeurs des paramètres.
     86  On ne spécifie pas les bornes. Elles sont positionnées
     87  à [0,1], et on pourra les modifier plus tard.
     88*/
    10589Integrator::Integrator(GeneralFunction* gff, double* par)
    106 //
    107 //      Constructeur à partir d'une GeneralFunction. La fonction doit être une
    108 //      fonction de une variable, et on fournit les valeurs des paramètres.
    109 //      On ne spécifie pas les bornes. Elles sont positionnées
    110 //      à [0,1], et on pourra les modifier plus tard.
    111 //--
    11290: mFunc(NULL), mGFF(gff), mGFFParm(par),
    11391  mNStep(50), mDX(-1), mReqPrec(-1),
     
    12098{if(mFunc) delete mFunc;}
    12199
    122 //++
    123 // Titre        Méthodes
    124 //--
    125 
    126 //++
     100/*!
     101  \brief Spécifie le nombre de pas pour l'intégration numérique.
     102 
     103  La signification peut dépendre de la méthode d'intégration.
     104*/
    127105Integrator&
    128106Integrator::NStep(int n)
    129 //
    130 //      Spécifie le nombre de pas pour l'intégration numérique.
    131 //      La signification peut dépendre de la méthode d'intégration.
    132 //--
    133107{
    134108  mNStep = n;
     
    138112}
    139113
    140 //++
     114/*!
     115  \brief Spécifie le nombre de pas pour l'intégration numérique.
     116 
     117  La signification peut dépendre de la méthode d'intégration.
     118*/
    141119Integrator&
    142120Integrator::DX(double d)
    143 //
    144 //      Spécifie le pas d'intégration.
    145 //      La signification peut dépendre de la méthode d'intégration.
    146 //--
    147121{
    148122  mDX = d;
     
    152126}
    153127
    154 //++
     128/*!
     129  \brief Spécifie la précision souhaitée.
     130
     131  La signification peut dépendre de la méthode d'intégration.
     132  Non disponible dans toutes les méthodes d'intégration.
     133*/
    155134Integrator&
    156135Integrator::ReqPrec(double p)
    157 //
    158 //      Spécifie la précision souhaitée.
    159 //      La signification peut dépendre de la méthode d'intégration.
    160 //      Non disponible dans toutes les méthodes d'intégration.
    161 //--
    162136{
    163137  DBASSERT( !"Pas encore implemente !");
     
    168142}
    169143
    170 //++
     144//! Spécifie les bornes de l'intégrale.
    171145Integrator&
    172146Integrator::Limits(double xmin, double xmax)
    173 //
    174 //      Spécifie les bornes de l'intégrale.
    175 //--
    176147{
    177148  mXMin = xmin;
     
    181152}
    182153
    183 //++
     154//! Spécifie la fonction à intégrer, sous forme double f(double).
    184155Integrator&
    185156Integrator::Func(FUNC f)
    186 //
    187 //      Spécifie la fonction à intégrer, sous forme double f(double).
    188 //--
    189157{
    190158  mFunc = f;
     
    195163}
    196164
    197 //++
     165/*!
     166  \brief Spécifie la fonction à intégrer, sous forme de GeneralFunction
     167  à une variable, et les paramètres sont fournis.
     168*/
    198169Integrator&
    199170Integrator::Func(GeneralFunction* gff, double* par)
    200 //
    201 //      Spécifie la fonction à intégrer, sous forme de GeneralFunction
    202 //      à une variable, et les paramètres sont fournis.
    203 //--
    204171{
    205172  mGFF = gff;
     
    234201}
    235202
    236 //++
    237 // Class        TrpzInteg
    238 // Lib          Outils++
    239 // include      integ.h
    240 //
    241 //      Classe d'intégration par la méthode des trapèzes.
    242 //      Voir Integrator pour les méthodes. Le nombre de pas
    243 //      est le nombre de trapèze, le pas d'intégration est
    244 //      la largeur des trapèzez. Impossible de demander une
    245 //      précision.
    246 //
    247 //--
    248 //++
    249 // Links        Parents
    250 // Integrator
    251 //--
    252 
    253 //++
    254 // Titre        Constructeurs
    255 //      Voir Integrator pour les détails.
    256 //--
    257 
    258 //++
     203/*!
     204  \ingroup NTools
     205  \class SOPHYA::TrpzInteg
     206
     207  \brief Implementation de Integrator par la methode des trapezes.
     208 
     209  Classe d'intégration par la méthode des trapèzes.
     210  Voir Integrator pour les méthodes. Le nombre de pas
     211  est le nombre de trapèze, le pas d'intégration est
     212  la largeur des trapèzez. Impossible de demander une
     213  précision.
     214 
     215  \sa SOPHYA::Integrator
     216*/
     217
     218
    259219TrpzInteg::TrpzInteg()
    260 //
    261 //--
    262 {}
    263 
    264 //++
     220{}
     221
    265222TrpzInteg::TrpzInteg(FUNC f, double xmin, double xmax)
    266 //
    267 //--
    268223: Integrator(f, xmin, xmax)
    269224{}
    270 //++
     225
    271226TrpzInteg::TrpzInteg(fun f, double xmin, double xmax)
    272 //
    273 //--
    274227: Integrator(f, xmin, xmax)
    275228{}
    276229
    277 //++
    278230TrpzInteg::TrpzInteg(FUNC f)
    279 //
    280 //--
    281231: Integrator(f)
    282232{}
    283233
    284234TrpzInteg::TrpzInteg(fun f)
    285 //
    286 //--
    287235: Integrator(f)
    288236{}
    289237
    290 //++
    291238TrpzInteg::TrpzInteg(GeneralFunction* gff, double* par, double xmin, double xmax)
    292 //
    293 //--
    294239: Integrator(gff, par, xmin, xmax)
    295240{}
    296241
    297 //++
    298242TrpzInteg::TrpzInteg(GeneralFunction* gff, double* par)
    299 //
    300 //--
    301243: Integrator(gff, par)
    302244{}
     
    305247{}
    306248
     249//! Return the value of the integral.
    307250double
    308251TrpzInteg::Value()
     
    329272
    330273
    331 //++
    332 // Class        GLInteg
    333 // Lib          Outils++
    334 // include      integ.h
    335 //
    336 //      Classe d'intégration par la méthode de Gauss-Legendre.
    337 //      Voir Integrator pour les méthodes.
    338 //      Pour le moment, nstep est l'ordre de la méthode.
    339 //      Il est prévu un jour de spécifier l'ordre, et que NStep
    340 //      découpe en intervalles sur chacun desquels on applique GL.
    341 //      Le principe de la méthode est de calculer les valeurs de la
    342 //      fonction aux zéros des polynomes de Legendre. Avec les poids
    343 //      qui vont bien, GL d'ordre n est exacte pour des polynomes de
    344 //      degré <= 2n+1 (monome le + haut x^(2*n-1).
    345 //      Impossible de demander une précision donnée.
    346 //
    347 //--
    348 //++
    349 // Links        Parents
    350 // Integrator
    351 //--
    352 
    353 //++
    354 // Titre        Constructeurs
    355 //      Voir Integrator pour les détails.
    356 //--
    357 
    358 
    359 
    360 
    361 //++
     274/*!
     275  \ingroup NTools
     276  \class SOPHYA::GLInteg
     277 
     278  \brief Implementation de Integrator par la methode de Gauss-Legendre.
     279
     280  Classe d'intégration par la méthode de Gauss-Legendre.
     281  Voir Integrator pour les méthodes.
     282  Pour le moment, nstep est l'ordre de la méthode.
     283  Il est prévu un jour de spécifier l'ordre, et que NStep
     284  découpe en intervalles sur chacun desquels on applique GL.
     285  Le principe de la méthode est de calculer les valeurs de la
     286  fonction aux zéros des polynomes de Legendre. Avec les poids
     287  qui vont bien, GL d'ordre n est exacte pour des polynomes de
     288  degré <= 2n+1 (monome le + haut x^(2*n-1).
     289  Impossible de demander une précision donnée.
     290
     291  \sa SOPHYA::Integrator
     292
     293  \warning statut EXPERIMENTAL , NON TESTE
     294*/
     295
     296
     297
    362298GLInteg::GLInteg()
    363 //
    364 //--
    365299: mXPos(NULL), mWeights(NULL)
    366300{}
    367301
    368302
    369 //++
    370303GLInteg::GLInteg(FUNC f, double xmin, double xmax)
    371 //
    372 //--
    373304: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
    374305{
    375306  NStep(1);
    376307}
     308
    377309GLInteg::GLInteg(fun f, double xmin, double xmax)
    378 //
    379 //--
    380310: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
    381311{
    382312  NStep(1);
    383313}
    384 //++
     314
    385315GLInteg::GLInteg(FUNC f)
    386 //
    387 //--
    388316: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    389317{
    390318  NStep(1);
    391319}
     320
    392321GLInteg::GLInteg(fun f)
    393 //
    394 //--
    395322: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    396323{
     
    398325}
    399326
    400 //++
    401327GLInteg::GLInteg(GeneralFunction* gff, double* par, double xmin, double xmax)
    402 //
    403 //--
    404328: Integrator(gff, par, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
    405329{
     
    407331}
    408332
    409 //++
    410333GLInteg::GLInteg(GeneralFunction* gff, double* par)
    411 //
    412 //--
    413334: Integrator(gff, par), mXPos(NULL), mWeights(NULL), mOrder(8)
    414335{
     
    453374
    454375
     376//! Definit l'ordre de la methode d'integration Gauus-Legendre
    455377GLInteg&
    456378GLInteg::SetOrder(int order)
     
    462384
    463385
    464 
     386//! Retourne la valeur de l'integrale
    465387double
    466388GLInteg::Value()
     
    527449}
    528450
     451//! Imprime l'ordre et la valeur des poids sur cout
    529452void
    530453GLInteg::Print(int lp)
  • trunk/SophyaLib/NTools/ntoolsinit.cc

    r2615 r2808  
    1515/*!
    1616   \defgroup NTools NTools module
    17    This module contains various tools for Sophya.
    1817*/
    1918
     
    2322  \class SOPHYA::NToolsInitiator
    2423  \ingroup NTools
    25   Tools initiator
     24  \brief NTools module initializer.
     25
     26   This module contains various tools for Sophya, in particular numerical algorithms
     27   such as :
     28   - Non linear fitting (parameter determination) : GeneralFit , MinZSimplex
     29   - FFT (FFTServerInterface, FFTPackServer)
     30   - Spline interpolation
     31   - Numerical integration and differential equations
     32   - Date/time manipulation and some usual astronomical quantities (datime.c .h)
    2633*/
    2734NToolsInitiator::NToolsInitiator()
  • trunk/SophyaLib/NTools/poly.cc

    r2615 r2808  
    1414  \ingroup NTools
    1515  One dimensional polynomials class.
     16  \warning status EXPERIMENTAL - not fully tested.
    1617*/
    1718
     
    350351  \ingroup NTools
    351352  Two dimensional polynomials class.
     353  \warning status EXPERIMENTAL - not fully tested.
    352354*/
    353355
  • trunk/SophyaLib/NTools/simplex.cc

    r2650 r2808  
    1010//---------------------------------------------------------------
    1111// Interface de classe de function multivariable pour le SimplexMinmizer
     12/*!
     13  \class SOPHYA::MinZFunction
     14  \ingroup NTools
     15  Interface definition for a function object f(x[]) for which MinZSimplex can
     16  search the minimum.
     17  The pure virtual method Value() should be implemented by the derived classes.
     18*/
    1219
    1320MinZFunction::MinZFunction(unsigned int nvar)
     
    2330//-------------------  Classe   MinZFuncXi2  --------------------
    2431//---------------------------------------------------------------
     32/*!
     33  \class SOPHYA::MinZXi2
     34  \ingroup NTools
     35  Implements the MinZFunction interface using a xi2 calculator
     36  \sa GeneralXi2 GeneralFitData
     37*/
    2538MinZFuncXi2::MinZFuncXi2(GeneralXi2* gxi2, GeneralFitData* gd)
    2639  : mGXi2(gxi2) , mGData(gd), MinZFunction(gxi2->NPar())
     
    174187}
    175188
     189/*!
     190  \class SOPHYA::MinZSimplex
     191  \ingroup NTools
     192  This class implements non linear minimization (optimization)
     193  in a multidimensional space following the \b Simplex method.
     194  A \b Simplex is a geometrical figure made of N+1 points in a
     195  N-dimensional space. (triangle in a plane, tetrahedron in 3-d space).
     196  The minimization method implemented in this class is based on the
     197  algorithm described in "Numerical Recipes, Chapter X".
     198
     199  The algorithm has been slightly enhanced :
     200  - More complex convergence / stop test
     201  - A new transformation of the simplex has been included (ExpandHigh)
     202
     203  For each step, on of the following geometrical transform is performed
     204  on the Simplex figure:
     205  - Reflection : reflection away from the high point (expansion by factor Alpha)
     206  - ReflecExpand : reflection way from the high point and expansion by factor Beta2
     207  - ContractHigh : Contraction along the high point (factor Beta)
     208  - ContractLow : Contraction toward the low point (factor Beta2)
     209  - ExpandHigh : Expansion along the high point
     210
     211  \sa GeneralFit
     212
     213  The following sample code shows a usage example:
     214  \code
     215  include "simplex.h"
     216  ...
     217  // Define our function to be minimized:
     218  class MySFunc : public MinZFunction {
     219  public:
     220    MySFunc() : MinZFunction(2) {}
     221    virtual double Value(double const xp[])
     222    { return (xp[0]*xp[0]+2*xp[1]*xp[1]); }
     223  };
     224
     225  ...
     226
     227  MySFunc mysf;
     228  MinZSimplex simplex(&mysf);
     229  // Guess the center and step for constructing the initial simplex
     230  Vector x0(2); x0 = 1.;
     231  Vector step(2); step = 2.;
     232  simplex.SetInitialPoint(x0);
     233  simplex.SetInitialStep(step);
     234  Vector oparm(2);
     235  int rc = simplex.Minimize(oparm);
     236  if (rc != 0) {
     237    string srt;
     238    int sr = simplex.StopReason(srt);
     239    cout << " Convergence Pb, StopReason= " << sr << " : " << srt << endl;
     240    }
     241  else {
     242    cout << " Converged: NStep= " << simplex.NbIter()
     243         << " OParm= " << oparm << endl;
     244    }
     245  \endcode
     246*/
     247
     248/*!
     249  \brief Auto test function
     250  \param tsel : select autotest (0,1,2,3,4)  , tsel<0 -> all
     251  \param prtlev : printlevel
     252*/
    176253int MinZSimplex::AutoTest(int tsel, int prtlev)
    177254{
     
    214291}
    215292
     293//! Constructor from pointer to MinZFunction object
    216294MinZSimplex::MinZSimplex(MinZFunction *mzf)
    217295  : mZF(mzf) , mPoint0(mZF->NVar()) , mStep0(mZF->NVar())
     
    234312}
    235313
     314//! Perform the minimization
     315/*!
     316  Return 0 if success
     317  \param fpoint : vector containing the optimal point
     318 
     319  Convergence test :
     320  \verbatim
     321  On minimise f(x) f=mZF->Value() ,
     322              f_max = max(f) sur simplex , f_min = min(f) sur simplex
     323              fm = (abs(f_max)+abs(f_min))
     324              [Delta f] = abs(f_max-f_min)
     325              [Delta f/f]simplex = 2.*Delta f / fm
     326              fm2 = (abs(f_max)+abs(f_max(iter-1)))
     327              [Delta f_max/f_max]iter = [f_max(iter-1)-f_max]/fm2
     328  Test d'arret : 
     329   fm < mTol0                                                       OU
     330   [Delta f/f]simplex              < mTol1   mRep1 fois de suite    OU
     331   [Delta f_max/f_max]iter         < mTol2   mRep2 fois de suite 
     332*/
    236333int MinZSimplex::Minimize(Vector& fpoint)
    237334{
     
    411508}
    412509
     510//! Return the stop reason and fills the corresponding string description
    413511int MinZSimplex::StopReason(string& s)
    414512{
  • trunk/SophyaLib/NTools/simplex.h

    r2650 r2808  
    2828namespace SOPHYA {
    2929
    30 //! Interface definition for multivaruable function (used by SimplexMinmizer)
     30//! Interface definition for multivariable function (used by SimplexMinmizer)
    3131class MinZFunction {
    3232public:
     
    4242};
    4343
    44 //!  Classe implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData
     44//!  Wrapper class implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData
    4545class MinZFuncXi2 : public MinZFunction {
    4646public:
     
    6161  virtual        ~MinZSimplex();
    6262
     63  //! Return the parameter space dimension
    6364  inline int     NDim() { return mZF->NVar(); }
    6465  // Simplex initial
     66  //! Defines the initial point (center of simplex figure)
    6567  inline void    SetInitialPoint(Vector& point) { mPoint0 = point; }
     68  //! Defines the step along each dimension to construct the simplex from initial point
    6669  inline void    SetInitialStep(Vector& step) { mStep0 = step; }
    6770
     71  //! Set the info/debug print level 
    6872  inline void    SetPrtLevel(int lev=0) { mPrt = lev; }
     73  //! Return the current print level
    6974  inline int     PrtLevel() { return mPrt; }
    7075
     76  //! Set the maximum number of iteration
    7177  inline void    SetMaxIter(int max = 100000) { mMaxIter = max; }
     78  //! Return the current  max iter
    7279  inline int     MaxIter() { return mMaxIter; }
     80  //! Return the number of iterations performed
    7381  inline int     NbIter() { return mIter; }
     82  //! Return the stop reason
    7483  inline int     StopReason() { return mStop; }
     84  //! Return the stop reason and a description string (\b s)
    7585         int     StopReason(string& s);
    7686
     
    8696  //  [Delta f/f]simplex              < mTol1   mRep1 fois de suite    OU
    8797  //  [Delta f_max/f_max]iter         < mTol2   mRep2 fois de suite
    88   //
     98
     99  //! Define the tolerances for the various convergence tests
    89100  inline void    SetStopTolerance(double tol0=1.e-39, double tol1 = 1.e-3, int rep1=5,
    90101                                  double tol2=1.e-4, int rep2=5)   
     
    97108  // Beta2  = Facteur d'homothetie pour la contraction vers le sommet bas f_min (ContractLow)
    98109  // Gamma2 = Facteur d'homothetie pour la l'extension pour le sommet haut ExpandHigh
     110
     111  //! Define the similarity (homothetic) factors for the different simplex transformations
    99112  inline void    SetControls(double alpha=1., double beta=0.5, double beta2=0.5,
    100113                             double gamma=2.0, double gamma2=2.0)
    101114                 { mAlpha = alpha; mBeta = beta; mBeta2 = beta2;  mGamma = gamma; mGamma2 = gamma2;} 
    102115
     116  //! Return the the homothetic factor for Reflection
    103117  inline double  Alpha() { return mAlpha; }
     118  //! Return the the homothetic factor for ContractHigh (contraction away from high point)
    104119  inline double  Beta() { return mBeta; }
     120  //! Return the the homothetic factor for ContractLow (contraction toward the low point)
    105121  inline double  Beta2() { return mBeta2; }
     122  //! Return the the homothetic factor for ReflecExpand (reflection+expansion)
    106123  inline double  Gamma() { return mGamma; }
     124  //! Return the the homothetic factor for ExpandHigh (expansion along high point)
    107125  inline double  Gamma2() { return mGamma2; }
    108126
Note: See TracChangeset for help on using the changeset viewer.