how to use (Jacobian Generator)

    1. Installation of Jacobian Generator version
      1. Download JacobianGenerator zip file (jacobianGenerator_v2.0.zip) from the download page.
      2. You can get jar file (jacobianGenerator_v2.0.jar) file by unzipping the file.
    2. how to use
      1. jacobianGetter (Jacobian Matrix element calculation program) generator
        Run JacobianGenerator.jar with arguments which corresponds to “output language”, “JGML filename”,  “output directory name”, “output file name”.
        ex) java -jar JacobianGenerator.jar -C FHN.jgml output FHN.c
        (output language: -C, JGML filename: FHN.jgml, output directory name: output, output file name: FHN.c)
      2. outputs
        Three different programs (type0, type1 and type2) are generated. These three program have different form of Jacobian Matrix element calculation function because of the C compiler limitation for the maximum line number of one function.

        • type 0
          obtain elements of Jacobian Matrix by branching the execution line by the row and column number of the Matrix element.
          ex) output getJacobiElement function of type 0

          double getJacobiElement ( int n , int m , Variable* var ) {
            double jacobiElement;
            if(n==0&&m==0){
              get_cellml0_MainMain_ddxdtdx(var);
              jacobiElement=var->cellml0_MainMain_ddxdtdx;
            }
            if(n==0&&m==1){
              get_cellml0_MainMain_ddxdtdy(var);
              jacobiElement=var->cellml0_MainMain_ddxdtdy;
            }
            if(n==1&&m==0){
              get_cellml0_MainMain_ddydtdx(var);
              jacobiElement=var->cellml0_MainMain_ddydtdx;
            }
            if(n==1&&m==1){
              get_cellml0_MainMain_ddydtdy(var);
              jacobiElement=var->cellml0_MainMain_ddydtdy;
            }
            return jacobiElement;
          }
          
        • type 1
          Different functions are provided for each row of Jacobian Matrix.
          ex) output getJacobiElement function of type 1

          double getJacobiElement ( int n , int m , Variable* var ) {
            if(n==0) 
              return getJacobiElement0_N(m,var);
            if(n==1) 
              return getJacobiElement1_N(m,var);
          }
          double getJacobiElement0_N ( int m , Variable* var ) {
            double jacobiElement;
            if(m==0){
              get_cellml0_MainMain_ddxdtdx(var);
              jacobiElement=var->cellml0_MainMain_ddxdtdx;
            }
            if(m==1){
              get_cellml0_MainMain_ddxdtdy(var);
              jacobiElement=var->cellml0_MainMain_ddxdtdy;
            }
            return jacobiElement;
          }
          double getJacobiElement1_N ( int m , Variable* var ) {
            double jacobiElement;
            if(m==0){
              get_cellml0_MainMain_ddydtdx(var);
              jacobiElement=var->cellml0_MainMain_ddydtdx;
            }
            if(m==1){
              get_cellml0_MainMain_ddydtdy(var);
              jacobiElement=var->cellml0_MainMain_ddydtdy;
            }
            return jacobiElement;
          }
          
        • type 2
          Different functions are provided for every row and column number of Jacobian Matrix.
          ex) output getJacobiElement function of type 2

          double getJacobiElement0_0 ( Variable* var ) {
            double jacobiElement;
            get_cellml0_MainMain_ddxdtdx(var);
            jacobiElement=var->cellml0_MainMain_ddxdtdx;
            return jacobiElement;
          }
          double getJacobiElement0_1 ( Variable* var ) {
            double jacobiElement;
            get_cellml0_MainMain_ddxdtdy(var);
            jacobiElement=var->cellml0_MainMain_ddxdtdy;
            return jacobiElement;
          }
          double getJacobiElement1_0 ( Variable* var ) {
            double jacobiElement;
            get_cellml0_MainMain_ddydtdx(var);
            jacobiElement=var->cellml0_MainMain_ddydtdx;
            return jacobiElement;
          }
          double getJacobiElement1_1 ( Variable* var ) {
            double jacobiElement;
            get_cellml0_MainMain_ddydtdy(var);
            jacobiElement=var->cellml0_MainMain_ddydtdy;
            return jacobiElement;
          }
      3. Brief explanation of jacobianGetter program code generated by the system
        1.correspondence between the element number and the variable names
        プログラムの最初にコメントアウトがあり、生成されたプログラム内でヤコビ行列の行列要素と行列番号の対応関係を示している。
        例:
        /*
        denomVar List
        cellml0.Main.x    0
        cellml0.Main.y    1
        numerVar List
        cellml0.Main.dxdt    0
        cellml0.Main.dydt    1
        */
        この例の場合、ヤコビ行列Jは以下のようになる、
        J(0,0)=d(dxdt)/dx    J(0,1)=d(dxdt)/dy
        J(1,0)=d(dydt)/dx    J(1,1)=d(dydt)/dy
        2.struct variable
        jacobianGetter内では、すべての変数の値はvariableという構造体に格納されている。
        3.main function
        Newton法を1000回行い、平衡点を求めるプログラムが生成されている。平衡点を計算する前のdenomvarの値と計算した後が出力される。
        4.getJacobianElement function
        ヤコビ行列の要素の値を取得する関数。行番号と列番号を引数として与えると、
        該当する行列要素を取得し返す。
        5.getCellMLFunc関数
        numervarの値を計算し取得する関数。行番号を与えると該当するnumervarの値を返す。
        6.get_[変数名]関数
        関数名に書かれた変数を計算し取得する関数。
    3. Jacobian Generator Example usage
      How to execute jacobianGetter
      1.同時にコンパイルするプログラムコード
      「CellDataFunc.c」「linearSolver.c」「getEigenValue.c」の3つがある。必要に応じて、これらのプログラムコードをjacobianGetterと同時にコンパイルする必要がある。
      ・CellDataFunc.c
      出力結果をCSV形式で書きだす際に用いる関数のライブラリ。「CellData_open関数」でCSVファイルを開き、「CellData_print_string関数」「CellData_print_int関数」「CellData_print_double関数」でそれぞれstring型、int型、double型の値をCSVファイルに書き込むことができる。
      ・linearSolver.c
      Newton法を行う途中で、線形を解く(接戦の解を求める)際に用いる「linearSolver関数」がある。
      ・getEigenValue.c
      行列の固有値を求める「getEigenValue関数」がある。この関数は「ヤコビ行列」「固有値の実部を格納する配列」「固有値の虚部を格納する配列」の3つを引数とする。また、固有値の計算にはLAPACKを用いており、インストールする必要がある。
      必要なパッケージ:
      ・LAPACK…varsion3.8.0
      ・OpenBLAS…1.13 BSD version
      2.example execution command line to compile
      ・calculation of equilibrium point
      gcc FHN.c linearSolver.c
      ・calculation of eigen values
      gcc FHN.c linearSolver.c getEigenValue.c lapack-release\lib\liblapack.a OpenBLAS\lib\libopenblas.a -lgfortran
      note: LAPACK and OpenBLAS are necessary to calculate eigen values. optine “-lgforntran” is also necessary.

Comments are closed.