Changeset 13934


Ignore:
Timestamp:
2012-11-17T01:36:22+01:00 (11 years ago)
Author:
wbraun
Message:

prevent throw for division by zero in non-linear system solver, since the solver can manage that.


Location:
trunk
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/SimulationRuntime/c/simulation/solver/nonlinearSystem.c

    r13758 r13934  
    117117  data->simulationInfo.currentNonlinearSystemIndex = sysNumber;
    118118
     119  /* enable to avoid division by zero */
     120  data->simulationInfo.noThrowDivZero = 1;
     121
    119122  /* strategy for solving nonlinear system
    120123   *
     
    127130  success = solveHybrd(data, sysNumber);
    128131  nonlinsys[sysNumber].solved = success;
     132
     133  /* enable to avoid division by zero */
     134  data->simulationInfo.noThrowDivZero = 0;
     135
    129136
    130137  return 0;
  • trunk/SimulationRuntime/c/simulation_data.h

    r13787 r13934  
    335335    modelica_string variableFilter;
    336336
    337     modelica_boolean initial;        /* =1 during initialization, 0 otherwise. */
    338     modelica_boolean terminal;       /* =1 at the end of the simulation, 0 otherwise. */
    339     modelica_boolean discreteCall;   /* =1 for a discrete step, otherwise 0 */
    340     modelica_boolean needToIterate;  /* =1 if reinit has been activated, iteration about the system is needed */
     337    /* indicators for simulations state */
     338    modelica_boolean initial;           /* =1 during initialization, 0 otherwise. */
     339    modelica_boolean terminal;          /* =1 at the end of the simulation, 0 otherwise. */
     340    modelica_boolean discreteCall;      /* =1 for a discrete step, otherwise 0 */
     341    modelica_boolean needToIterate;     /* =1 if reinit has been activated, iteration about the system is needed */
    341342    modelica_boolean simulationSuccess; /*=0 the simulation run successful, otherwise an error code is set */
    342     modelica_boolean sampleActivated;    /* =1 a sample expresion if going to be actived, 0 otherwise */
    343     modelica_boolean solveContinuous;        /* =1 for the first step to initialize all relation,  0 otherwise. */
     343    modelica_boolean sampleActivated;   /* =1 a sample expresion if going to be actived, 0 otherwise */
     344    modelica_boolean solveContinuous;   /* =1 during the continuous integration to avoid zero-crossings jums,  0 otherwise. */
     345    modelica_boolean noThrowDivZero;    /* =1 if solving nonlinear system to avoid THROW for division by zero,  0 otherwise. */
     346    modelica_boolean found_solution;    /* helper for mixed systems */
    344347
    345348    void** extObjs; /* External objects */
     
    385388    int currentNonlinearSystemIndex;
    386389
    387     int found_solution;             /* helper for mixed systems */
    388 
    389390    /* delay vars */
    390391    double tStart;
  • trunk/SimulationRuntime/c/util/division.c

    r13787 r13934  
    3737#include "omc_error.h"
    3838
    39 modelica_real division_error_time(modelica_real b, const char* division_str, modelica_real time, const char* file, long line)
     39modelica_real division_error_time(modelica_real b, const char* division_str, modelica_real time, const char* file, long line, modelica_boolean noThrow)
     40{
     41  if (noThrow){
     42    WARNING1(LOG_UTIL, "division by zero in partial equation: %s", division_str);
     43    WARNING1(LOG_UTIL, "at Time=%f", time);
     44    WARNING(LOG_UTIL,  "solver will try to handle that.");
     45  } else {
     46    WARNING1(LOG_STDOUT, "division by zero in partial equation: %s", division_str);
     47    WARNING1(LOG_STDOUT, "at Time=%f", time);
     48    WARNING2(LOG_STDOUT, "[line] %ld | [file] %s", line, file);
     49#ifndef __APPLE_CC__
     50    THROW("division by zero");
     51#endif
     52  }
     53  return b;
     54}
     55
     56modelica_real division_warning_time(modelica_real b, const char* division_str, modelica_real time, const char* file, long line)
    4057{
    4158  WARNING1(LOG_STDOUT, "division by zero in partial equation: %s", division_str);
    4259  WARNING1(LOG_STDOUT, "at Time=%f", time);
    43   WARNING2(LOG_STDOUT, "[line] %ld | [file] %s", line, file);
    44 #ifndef __APPLE_CC__
    45   THROW("division by zero");
    46 #endif
     60
    4761  return b;
    4862}
     63
     64
    4965
    5066modelica_real division_error(modelica_real b, const char* division_str, const char* file, long line)
  • trunk/SimulationRuntime/c/util/division.h

    r12006 r13934  
    4040#define DIVISION(a,b,c) (((b) != 0) ? (isnan_error(((a) / (b)), c, __FILE__, __LINE__)) : ((a) / division_error(b, c, __FILE__, __LINE__)))
    4141#else
    42 #define DIVISION(a,b,c) (((b) != 0) ? ((a) / (b)) : ((a) / division_error_time(b, c, time, __FILE__, __LINE__)))
     42#define DIVISION(a,b,c) (((b) != 0) ? ((a) / (b)) : ((a) / division_error_time(b, c, time, __FILE__, __LINE__,data->simulationInfo.noThrowDivZero?1:0)))
    4343#endif
    4444#define DIVISIONNOTIME(a,b,c) (((b) != 0) ? ((a) / (b)) : ((a) / division_error(b, c, __FILE__, __LINE__)))
    4545
    46 modelica_real division_error_time(modelica_real b, const char* division_str, modelica_real time, const char* file, long line);
     46modelica_real division_error_time(modelica_real b, const char* division_str, modelica_real time, const char* file, long line, modelica_boolean noThrow);
    4747modelica_real division_error(modelica_real b, const char* division_str, const char* file, long line);
    4848modelica_real isnan_error(modelica_real b, const char* division_str, const char* file, long line);
  • trunk/testsuite/simulation/libraries/msl31/Makefile

    r13756 r13934  
    1717Modelica.Electrical.Analog.Examples.HeatingRectifier.mos \
    1818Modelica.Electrical.Analog.Examples.HeatingResistor.mos \
     19Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos \
    1920Modelica.Electrical.Analog.Examples.ShowVariableResistor.mos \
    2021Modelica.Electrical.Machines.Examples.DCSE_Start.mos \
     
    102103NOTSIMULATETEST= \
    103104Modelica.Electrical.Analog.Examples.ControlledSwitchWithArc.mos \
    104 Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos \
    105105Modelica.Electrical.Analog.Examples.SwitchWithArc.mos \
    106106Modelica.Electrical.Machines.Examples.Rectifier6pulse.mos \
  • trunk/testsuite/simulation/libraries/msl31/Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos

    r13150 r13934  
    1010loadModel(Modelica,{"3.1"});
    1111
    12 simulate(Modelica.Electrical.Analog.Examples.ShowSaturatingInductor,stopTime=6.28319978714);
     12simulate(Modelica.Electrical.Analog.Examples.ShowSaturatingInductor);
    1313res := OpenModelica.Scripting.compareSimulationResults("Modelica.Electrical.Analog.Examples.ShowSaturatingInductor_res.mat",
    1414  "ReferenceFiles/Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mat","Modelica.Electrical.Analog.Examples.ShowSaturatingInductor_diff.csv",0.01,0.00001,
     
    2727// record SimulationResult
    2828//     resultFile = "Modelica.Electrical.Analog.Examples.ShowSaturatingInductor_res.mat",
    29 //     simulationOptions = "startTime = 0.0, stopTime = 6.28319978714, numberOfIntervals = 500, tolerance = 1e-06, method = 'dassl', fileNamePrefix = 'Modelica.Electrical.Analog.Examples.ShowSaturatingInductor', storeInTemp = false, noClean = false, options = '', outputFormat = 'mat', variableFilter = '.*', measureTime = false, cflags = ''",
     29//     simulationOptions = "startTime = 0.0, stopTime = 6.2832, numberOfIntervals = 628, tolerance = 1e-06, method = 'dassl', fileNamePrefix = 'Modelica.Electrical.Analog.Examples.ShowSaturatingInductor', storeInTemp = false, noClean = false, options = '', outputFormat = 'mat', variableFilter = '.*', measureTime = false, cflags = '', simflags = ''",
    3030//     messages = ""
    3131// end SimulationResult;
  • trunk/testsuite/simulation/libraries/msl32/Makefile

    r13900 r13934  
    2727Modelica.Electrical.Analog.Examples.IdealTriacCircuit.mos \
    2828Modelica.Electrical.Analog.Examples.OvervoltageProtection.mos \
     29Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos \
    2930Modelica.Electrical.Analog.Examples.ShowVariableResistor.mos \
    3031Modelica.Electrical.Analog.Examples.SwitchWithArc.mos \
     
    143144Modelica.Electrical.Analog.Examples.AD_DA_conversion.mos \
    144145Modelica.Electrical.Analog.Examples.DifferenceAmplifier.mos \
    145 Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos \
    146146Modelica.Electrical.Analog.Examples.Rectifier.mos \
    147147Modelica.Mechanics.MultiBody.Examples.Elementary.Surfaces.mos \
  • trunk/testsuite/simulation/libraries/msl32/Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.mos

    r13603 r13934  
    1010loadModel(Modelica,{"3.2.1"});
    1111
    12 setMatchingAlgorithm("PFPlusExt");
    13 setIndexReductionMethod("dynamicStateSelection");
    1412simulate(Modelica.Electrical.Analog.Examples.ShowSaturatingInductor);
    1513getErrorString();
     
    2321// Result:
    2422// true
    25 // true
    26 // true
    2723// record SimulationResult
    28 //     resultFile = "",
     24//     resultFile = "Modelica.Electrical.Analog.Examples.ShowSaturatingInductor_res.mat",
    2925//     simulationOptions = "startTime = 0.0, stopTime = 6.2832, numberOfIntervals = 628, tolerance = 1e-06, method = 'dassl', fileNamePrefix = 'Modelica.Electrical.Analog.Examples.ShowSaturatingInductor', storeInTemp = false, noClean = false, options = '', outputFormat = 'mat', variableFilter = '.*', measureTime = false, cflags = '', simflags = ''",
    30 //     messages = "Simulation execution failed for model: Modelica.Electrical.Analog.Examples.ShowSaturatingInductor
    31 // warning | division by zero in partial equation: SaturatingInductance1.i / SaturatingInductance1.Ipar because SaturatingInductance1.Ipar == 0: File: C:/OpenModelica1.9.0/lib/omlibrary/Modelica 3.2.1/Electrical/Analog/Basic.mo Line: 439
    32 
    33 //         | at Time=0.000000
    34 
    35 //         | [line] 144 | [file] Modelica.Electrical.Analog.Examples.ShowSaturatingInductor.c
    36 
    37 // throw   | [line] 45 | [file] util/division.c
    38 
    39 //         | division by zero
    40 
    41 // "
     26//     messages = ""
    4227// end SimulationResult;
    4328// ""
    44 // "Error Open File!"
     29// "Files Equal!"
    4530// endResult
  • trunk/testsuite/simulation/modelica/nonlinear_system/Makefile

    r13771 r13934  
    55NonlinearMixed.mos \
    66Nonlinear.mos \
     7notanumberTest.mos \
    78
    89
Note: See TracChangeset for help on using the changeset viewer.