]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Improving control and documentation on Finite difference Approximations V7_2_0
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Mon, 22 Apr 2013 15:19:11 +0000 (17:19 +0200)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Mon, 22 Apr 2013 15:19:11 +0000 (17:19 +0200)
bin/AdaoCatalogGenerator.py
doc/reference.rst
src/daComposant/daNumerics/ApproximatedDerivatives.py
src/daEficas/generator_adao.py
src/daSalome/daYacsSchemaCreator/methods.py

index 1628a517d5b19d396a97b4bbce75dfc81d64a2e0..c6883653229bacf2f89fb695eede40dc01815cae 100644 (file)
@@ -61,6 +61,7 @@ def F_${data_name}(statut) : return FACT(statut = statut,
 
                                                       SCRIPTWITHONEFUNCTION_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()), fr="En attente d'un nom de fichier script, avec ou sans le chemin complet pour le trouver, contenant en variable interne une seule fonction de calcul nommée DirectOperator", ang="Waiting for a script file name, with or without the full path to find it, containing as internal variable only one function named DirectOperator"),
                                                       DifferentialIncrement = SIMP(statut="o", typ = "R", val_min=0, val_max=1, defaut=0.01, fr="Incrément de la perturbation dX pour calculer la dérivée, construite en multipliant X par l'incrément en évitant les valeurs nulles", ang="Increment of dX perturbation to calculate the derivative, build multiplying X by the increment avoiding null values"),
+                                                      CenteredFiniteDifference = SIMP(statut="o", typ = "I", into=(0, 1), defaut=0, fr="Formulation centrée (1) ou décentrée (0) pour la méthode des différences finies", ang="Centered (1) or uncentered (0) formulation for the finite difference method"),
                                                      ),
                                          SCRIPTWITHSWITCH_DATA = BLOC ( condition = " FROM in ( 'ScriptWithSwitch', ) ",
 
index ed57a45f3187634b5b8c75fd84ee54b375fa26f1..3336d0655ce42956c8cfd4c0ac80d33baecebb62 100644 (file)
@@ -777,6 +777,11 @@ representation.
 First functional form: using "*ScriptWithOneFunction*"
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
+.. index:: single: ScriptWithOneFunction
+.. index:: single: DirectOperator
+.. index:: single: DifferentialIncrement
+.. index:: single: CenteredFiniteDifference
+
 The first one consist in providing only one potentially non-linear function, and
 to approximate the tangent and the adjoint operators. This is done by using the
 keyword "*ScriptWithOneFunction*" for the description of the chosen operator in
@@ -794,7 +799,11 @@ template::
 In this case, the user can also provide a value for the differential increment,
 using through the GUI the keyword "*DifferentialIncrement*", which has a default
 value of 1%. This coefficient will be used in the finite difference
-approximation to build the tangent and adjoint operators.
+approximation to build the tangent and adjoint operators. The finite difference
+approximation order can also be chosen through the GUI, using the keyword
+"*CenteredFiniteDifference*", with 0 for an uncentered schema of first order,
+and with 1 for a centered schema of second order (of twice the first order
+computational cost). The keyword has a default value of 0.
 
 This first operator definition allow easily to test the functional form before
 its use in an ADAO case, greatly reducing the complexity of implementation.
@@ -806,6 +815,11 @@ The user has to treat these cases in his script.
 Second functional form: using "*ScriptWithFunctions*"
 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 
+.. index:: single: ScriptWithFunctions
+.. index:: single: DirectOperator
+.. index:: single: TangentOperator
+.. index:: single: AdjointOperator
+
 The second one consist in providing directly the three associated operators
 :math:`O`, :math:`\mathbf{O}` and :math:`\mathbf{O}^*`. This is done by using
 the keyword "*ScriptWithFunctions*" for the description of the chosen operator
@@ -846,6 +860,11 @@ these cases in his script.
 Third functional form: using "*ScriptWithSwitch*"
 +++++++++++++++++++++++++++++++++++++++++++++++++
 
+.. index:: single: ScriptWithSwitch
+.. index:: single: DirectOperator
+.. index:: single: TangentOperator
+.. index:: single: AdjointOperator
+
 This third form give more possibilities to control the execution of the three
 functions representing the operator, allowing advanced usage and control over
 each execution of the simulation code. This is done by using the keyword
index 9e09e6d9ac78e12208e63bdd6463b29781d4983d..95a4aca327f7c5100149a03bb5109387ba522855 100644 (file)
@@ -68,7 +68,7 @@ class FDApproximation:
         c'est-à-dire le gradient de H en X. On utilise des différences finies
         directionnelles autour du point X. X est un numpy.matrix.
         
-        Différences finies centrées :
+        Différences finies centrées (approximation d'ordre 2):
         1/ Pour chaque composante i de X, on ajoute et on enlève la perturbation
            dX[i] à la  composante X[i], pour composer X_plus_dXi et X_moins_dXi, et
            on calcule les réponses HX_plus_dXi = H( X_plus_dXi ) et HX_moins_dXi =
@@ -77,7 +77,7 @@ class FDApproximation:
            le pas 2*dXi
         3/ Chaque résultat, par composante, devient une colonne de la Jacobienne
         
-        Différences finies non centrées :
+        Différences finies non centrées (approximation d'ordre 1):
         1/ Pour chaque composante i de X, on ajoute la perturbation dX[i] à la 
            composante X[i] pour composer X_plus_dXi, et on calcule la réponse
            HX_plus_dXi = H( X_plus_dXi )
index 85535fd5d7929d510adb62631d13386ebc2b9272..3e525681ccdb97ed8dcbca752491f2a3624582c4 100644 (file)
@@ -210,6 +210,7 @@ class AdaoGenerator(PythonGenerator):
       self.text_da += data_name + "_ScriptWithOneFunction['Script']['Tangent'] = '" + data + "'\n"
       self.text_da += data_name + "_ScriptWithOneFunction['Script']['Adjoint'] = '" + data + "'\n"
       self.text_da += data_name + "_ScriptWithOneFunction['DifferentialIncrement'] = " + str(float(self.dictMCVal[search_type + "SCRIPTWITHONEFUNCTION_DATA__DifferentialIncrement"])) + "\n"
+      self.text_da += data_name + "_ScriptWithOneFunction['CenteredFiniteDifference'] = " + str(self.dictMCVal[search_type + "SCRIPTWITHONEFUNCTION_DATA__CenteredFiniteDifference"]) + "\n"
       self.text_da += data_name + "_config = {}\n"
       self.text_da += data_name + "_config['Type'] = 'Function'\n"
       self.text_da += data_name + "_config['From'] = 'ScriptWithOneFunction'\n"
index 432ae3b651645fa36d16447454b5114cea70c998..c49e3112b98b3eaef8351b423b8420d3ff604d56 100644 (file)
@@ -583,8 +583,9 @@ def create_yacs_proc(study_config):
     node_script += """    raise ValueError("ComputationFunctionNode: DirectOperator not found in the imported user script file")\n"""
     node_script += """import ApproximatedDerivatives\n"""
     node_script += """FDA = ApproximatedDerivatives.FDApproximation(\n"""
-    node_script += """    Function  = DirectOperator,\n"""
-    node_script += """    increment = %s,\n"""%str(ScriptWithOneFunction['DifferentialIncrement'])
+    node_script += """    Function   = DirectOperator,\n"""
+    node_script += """    increment  = %s,\n"""%str(ScriptWithOneFunction['DifferentialIncrement'])
+    node_script += """    centeredDF = %s,\n"""%str(ScriptWithOneFunction['CenteredFiniteDifference'])
     node_script += """    )\n"""
     node_script += """#\n"""
     node_script += """__data = []\n"""
@@ -804,8 +805,9 @@ def create_yacs_proc(study_config):
       node_script += """    raise ValueError("ComputationFunctionNode: DirectOperator not found in the imported user script file")\n"""
       node_script += """import ApproximatedDerivatives\n"""
       node_script += """FDA = ApproximatedDerivatives.FDApproximation(\n"""
-      node_script += """    Function  = DirectOperator,\n"""
-      node_script += """    increment = %s,\n"""%str(ScriptWithOneFunction['DifferentialIncrement'])
+      node_script += """    Function   = DirectOperator,\n"""
+      node_script += """    increment  = %s,\n"""%str(ScriptWithOneFunction['DifferentialIncrement'])
+      node_script += """    centeredDF = %s,\n"""%str(ScriptWithOneFunction['CenteredFiniteDifference'])
       node_script += """    )\n"""
       node_script += """#\n"""
       node_script += """__data = []\n"""