Changeset 25208


Ignore:
Timestamp:
07/05/20 23:44:11 (5 years ago)
Author:
Eric.Larour
Message:

CHG: added MatArray code for IoModelFetchDataToInput.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/classes/IoModel.cpp

    r25145 r25208  
    2727#include "../shared/io/io.h"
    2828#include "../shared/shared.h"
     29#include "../classes/Inputs2/TransientInput2.h"
    2930
    3031#ifdef _HAVE_CODIPACK_
     
    17161717                        }
    17171718                        break;
     1719                case 8: { //MatArray {{{
     1720
     1721                        /*variables:*/
     1722                        int numarray;
     1723                        IssmDouble** array=NULL;
     1724                        IssmDouble*  matrix=NULL;
     1725                        IssmDouble*  times = NULL;
     1726                        int* pM = NULL;
     1727                        int* pN = NULL;
     1728                        int M,N;
     1729
     1730                        /*fetch array of matrices:*/
     1731                        this->FetchData(&array,&pM,&pN,&numarray,vector_name);
     1732
     1733                        for (int i=0;i<numarray;i++){
     1734
     1735                                M=pM[i];
     1736                                N=pN[i];
     1737                                matrix=array[i];
     1738
     1739                                //recover time vector:
     1740                                times=xNew<IssmDouble>(N);
     1741                                for(int t=0;t<N;t++) times[t] = matrix[(M-1)*N+t];
     1742
     1743                                //initialize transient input dataset:
     1744                                TransientInput2* transientinput=inputs2->SetDatasetTransientInput(input_enum,i, times,N);
     1745                                for(int j=0;j<elements->Size();j++){
     1746
     1747                                        /*Get the right transient input*/
     1748                                        Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
     1749
     1750                                        /*Get values and lid list*/
     1751                                        const int   numvertices = element->GetNumberOfVertices();
     1752                                        int        *vertexlids = xNew<int>(numvertices);
     1753                                        int        *vertexsids = xNew<int>(numvertices);
     1754
     1755
     1756                                        /*Recover vertices ids needed to initialize inputs*/
     1757                                        _assert_(this->elements);
     1758                                        for(int k=0;k<numvertices;k++){
     1759                                                vertexsids[k] =reCast<int>(this->elements[numvertices*element->Sid()+k]); //ids for vertices are in the elements array from Matlab
     1760                                                vertexlids[k]=this->my_vertices_lids[vertexsids[k]-1];
     1761                                        }
     1762
     1763                                        if(M==this->numberofvertices || M==(this->numberofvertices+1)){
     1764
     1765                                                IssmDouble* values=xNew<IssmDouble>(numvertices);
     1766
     1767                                                for(int t=0;t<N;t++){
     1768                                                        for (int k=0;k<numvertices;k++)values[k]=matrix[N*vertexsids[k]+t];
     1769
     1770                                                        switch(element->ObjectEnum()){
     1771                                                                case TriaEnum:  transientinput->AddTriaTimeInput( t,numvertices,vertexlids,values,P1Enum); break;
     1772                                                                case PentaEnum: transientinput->AddPentaTimeInput(t,numvertices,vertexlids,values,P1Enum); break;
     1773                                                                default: _error_("Not implemented yet");
     1774                                                        }
     1775                                                }
     1776                                                xDelete<IssmDouble>(values);
     1777                                        }
     1778                                        else if(M==this->numberofelements || M==(this->numberofelements+1)){
     1779
     1780                                                IssmDouble value;
     1781
     1782                                                for(int t=0;t<N;t++){
     1783
     1784                                                        value=matrix[N*element->Sid()+t];
     1785                                                        //if(element->Sid()==188 && t==0)_printf_("value: " << value << "\n");
     1786                                                        switch(element->ObjectEnum()){
     1787                                                                case TriaEnum:  transientinput->AddTriaTimeInput( t,1,&element->lid,&value,P0Enum); break;
     1788                                                                case PentaEnum:  transientinput->AddPentaTimeInput( t,1,&element->lid,&value,P0Enum); break;
     1789                                                                default: _error_("Not implemented yet");
     1790                                                        }
     1791                                                }
     1792                                        }
     1793                                        else _error_("FetchDataToInput error message: row size of MatArray elements should be either numberofelements (+1) or numberofvertices (+1)");
     1794                                       
     1795                                        xDelete<int>(vertexlids);
     1796                                        xDelete<int>(vertexsids);
     1797                                }
     1798
     1799                                xDelete<IssmDouble>(times);
     1800                        }
     1801
     1802                        /*Delete data:*/
     1803                        for(int i=0;i<numarray;i++){
     1804                                IssmDouble* matrix=array[i];
     1805                                xDelete<IssmDouble>(matrix);
     1806                        }
     1807                        xDelete<IssmDouble*>(array);
     1808                        xDelete<int>(pM);
     1809                        xDelete<int>(pN);
     1810                        } //}}}
     1811                        break;
    17181812                case 7: //IssmDouble vector
    17191813                case 10:
Note: See TracChangeset for help on using the changeset viewer.