<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Menlo;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.gmailsignatureprefix
        {mso-style-name:gmail_signature_prefix;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hello thanks for the reply,<br>
<br>
I created a working minimal example (as minimal as I can think of?) that I include here, even though I am not sure which is the best format to do this, I just add some plain text:<br>
//##########################################################################################<br>
#include <petscksp.h><o:p></o:p></p>
<p class="MsoNormal">#include <petsc/petscpc.h><o:p></o:p></p>
<p class="MsoNormal">#include <petscksp.h><o:p></o:p></p>
<p class="MsoNormal">#include <petscpc.h><o:p></o:p></p>
<p class="MsoNormal">#include <petscsys.h><o:p></o:p></p>
<p class="MsoNormal">#include <petscsystypes.h><o:p></o:p></p>
<p class="MsoNormal">#include <petsc/private/kspimpl.h> /*I "petscksp.h" I*/<o:p></o:p></p>
<p class="MsoNormal">#include <cmath><o:p></o:p></p>
<p class="MsoNormal">#include <vector><o:p></o:p></p>
<p class="MsoNormal">#include <iomanip><o:p></o:p></p>
<p class="MsoNormal">#include <iostream><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">class petsc_solver{<o:p></o:p></p>
<p class="MsoNormal">    Vec petsc_x, petsc_b;<o:p></o:p></p>
<p class="MsoNormal">    Mat petsc_A;<o:p></o:p></p>
<p class="MsoNormal">    KSP petsc_ksp;<o:p></o:p></p>
<p class="MsoNormal">    PC petsc_pc;<o:p></o:p></p>
<p class="MsoNormal">    int linear_iter;<o:p></o:p></p>
<p class="MsoNormal">    KSPConvergedReason reason;<o:p></o:p></p>
<p class="MsoNormal">    bool first_time;  <o:p></o:p></p>
<p class="MsoNormal">    int n_rows;<o:p></o:p></p>
<p class="MsoNormal">    int number_of_pc_rebuilds=0;<o:p></o:p></p>
<p class="MsoNormal">    public:<o:p></o:p></p>
<p class="MsoNormal">    petsc_solver() {<o:p></o:p></p>
<p class="MsoNormal">        KSPCreate(PETSC_COMM_WORLD, &petsc_ksp);<o:p></o:p></p>
<p class="MsoNormal">        KSPSetFromOptions(petsc_ksp);<o:p></o:p></p>
<p class="MsoNormal">        KSPGetPC(petsc_ksp, &petsc_pc);<o:p></o:p></p>
<p class="MsoNormal">        KSPSetType(petsc_ksp, KSPBCGS);<o:p></o:p></p>
<p class="MsoNormal">        PCSetType(petsc_pc, PCILU);<o:p></o:p></p>
<p class="MsoNormal">        PCFactorSetLevels(petsc_pc, 0);<o:p></o:p></p>
<p class="MsoNormal">        KSPSetInitialGuessNonzero(petsc_ksp, PETSC_TRUE);<o:p></o:p></p>
<p class="MsoNormal">        <span lang="DE">KSPSetTolerances(petsc_ksp, 1.e-12, 1.e-8, 1e14,1000);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="DE">    </span>}<o:p></o:p></p>
<p class="MsoNormal">    void set_matrix(std::vector<int>& dsp,std::vector<int>& col,std::vector<double>& val){<o:p></o:p></p>
<p class="MsoNormal">        int *ptr_dsp = dsp.data();<o:p></o:p></p>
<p class="MsoNormal">        int *ptr_col = col.data();<o:p></o:p></p>
<p class="MsoNormal">        double *ptr_ele = val.data();<o:p></o:p></p>
<p class="MsoNormal">        n_rows=dsp.size()-1;<o:p></o:p></p>
<p class="MsoNormal">        std::cout<<"set petsc matrix, n_rows:"<<n_rows<<"\n";<o:p></o:p></p>
<p class="MsoNormal">        MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, n_rows,n_rows, ptr_dsp, ptr_col, ptr_ele,&petsc_A);<o:p></o:p></p>
<p class="MsoNormal">        MatSetOption(petsc_A, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE);<o:p></o:p></p>
<p class="MsoNormal">        MatSetOption(petsc_A, MAT_NO_OFF_PROC_ZERO_ROWS, PETSC_TRUE);<o:p></o:p></p>
<p class="MsoNormal">        KSPSetOperators(petsc_ksp, petsc_A, petsc_A);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    void set_rhs(std::vector<double>& val){<o:p></o:p></p>
<p class="MsoNormal">        double *ptr_ele = val.data();<o:p></o:p></p>
<p class="MsoNormal">        VecCreateSeqWithArray(PETSC_COMM_WORLD, 1, n_rows, NULL,&petsc_b);<o:p></o:p></p>
<p class="MsoNormal">        VecPlaceArray(petsc_b, ptr_ele);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    void set_sol(std::vector<double>& val){<o:p></o:p></p>
<p class="MsoNormal">        double *ptr_ele = val.data();<o:p></o:p></p>
<p class="MsoNormal">        VecCreateSeqWithArray(PETSC_COMM_WORLD, 1, n_rows, NULL,&petsc_x);<o:p></o:p></p>
<p class="MsoNormal">        VecPlaceArray(petsc_x, ptr_ele);<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    int solve(bool force_rebuild) {<o:p></o:p></p>
<p class="MsoNormal">        int solver_stat = 0;<o:p></o:p></p>
<p class="MsoNormal">        KSPGetPC(petsc_ksp, &petsc_pc);<o:p></o:p></p>
<p class="MsoNormal">        int ierr;<o:p></o:p></p>
<p class="MsoNormal">        // ierr = PetscObjectStateIncrease((PetscObject)petsc_A);<o:p></o:p></p>
<p class="MsoNormal">        // ierr = PetscObjectStateIncrease((PetscObject)petsc_b);<o:p></o:p></p>
<p class="MsoNormal">        MatAssemblyBegin(petsc_A,MAT_FINAL_ASSEMBLY);<o:p></o:p></p>
<p class="MsoNormal">        MatAssemblyEnd(petsc_A,MAT_FINAL_ASSEMBLY);<o:p></o:p></p>
<p class="MsoNormal">        VecAssemblyBegin(petsc_b);<o:p></o:p></p>
<p class="MsoNormal">        VecAssemblyEnd(petsc_b);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        // KSPSetOperators(petsc_ksp, petsc_A, petsc_A);<o:p></o:p></p>
<p class="MsoNormal">        ierr = KSPSolve(petsc_ksp, petsc_b, petsc_x);<o:p></o:p></p>
<p class="MsoNormal">        KSPGetConvergedReason(petsc_ksp, &reason);<o:p></o:p></p>
<p class="MsoNormal">        if (reason < 0){<o:p></o:p></p>
<p class="MsoNormal">            KSPGetIterationNumber(petsc_ksp, &linear_iter);<o:p></o:p></p>
<p class="MsoNormal">            std::cout<<"NOT CONVERGED!\n";<o:p></o:p></p>
<p class="MsoNormal">            // PetscPrintf(PETSC_COMM_WORLD,"KSPConvergedReason _aux: %D  PCREUSE: %D (%D=False %D=True) IERR:%i ITERS:%i\n",reason, reuse, PETSC_FALSE, PETSC_TRUE, ierr,linear_iter);<o:p></o:p></p>
<p class="MsoNormal">        return -1;<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        KSPGetIterationNumber(petsc_ksp, &linear_iter);<o:p></o:p></p>
<p class="MsoNormal">        return linear_iter;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    };<o:p></o:p></p>
<p class="MsoNormal">void change_rhs(int i, int n_rows,std::vector<double>&rhs){<o:p></o:p></p>
<p class="MsoNormal">    for(int row=0;row<n_rows;row++)rhs[row]=sin(1.*i+row)+1.*i*exp(row*1.e-3);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">void change_matrix(int i, int n_rows,std::vector<double>& vals){<o:p></o:p></p>
<p class="MsoNormal">    int nnz    = n_rows*3-2;<o:p></o:p></p>
<p class="MsoNormal">    for(int row=0;row<n_rows;row++){<o:p></o:p></p>
<p class="MsoNormal">        if(row==0) {<o:p></o:p></p>
<p class="MsoNormal">            vals[0]=3+cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">            vals[1]=-1+0.3*cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">        }else if(row==n_rows-1){<o:p></o:p></p>
<p class="MsoNormal">            vals[nnz-1]=3+cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">            vals[nnz-2]=-1+0.3*cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">        }else{<o:p></o:p></p>
<p class="MsoNormal">            vals[2+(row-1)*3]   =-1+0.1*cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">            vals[2+(row-1)*3+1] = 4+0.3*cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">            vals[3+(row-1)*3+2] =-1+0.2*cos(i+row);//pseduo random something<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">void set_crs_structure(int n_rows,std::vector<int>& dsp,std::vector<int>& col,std::vector<double>& val ){<o:p></o:p></p>
<p class="MsoNormal">    int nnz    = n_rows*3-2;<o:p></o:p></p>
<p class="MsoNormal">    std::cout<<"SETCRS ROWS:"<<n_rows<<" NNZ:"<<nnz<<"\n";<o:p></o:p></p>
<p class="MsoNormal">    dsp.resize(n_rows+1);<o:p></o:p></p>
<p class="MsoNormal">    col.resize(nnz);<o:p></o:p></p>
<p class="MsoNormal">    val.resize(nnz);<o:p></o:p></p>
<p class="MsoNormal">    for(int row=0;row<n_rows;row++){<o:p></o:p></p>
<p class="MsoNormal">        if(row==0) {<o:p></o:p></p>
<p class="MsoNormal">            col[0]=0;<o:p></o:p></p>
<p class="MsoNormal">            col[1]=1;<o:p></o:p></p>
<p class="MsoNormal">            dsp[row+1]=dsp[row]+2;<o:p></o:p></p>
<p class="MsoNormal">        }else if(row==n_rows-1){<o:p></o:p></p>
<p class="MsoNormal">            col[2+(row-1)*3+0]=row-1;<o:p></o:p></p>
<p class="MsoNormal">            col[2+(row-1)*3+1]=row;<o:p></o:p></p>
<p class="MsoNormal">            dsp[row+1]=dsp[row]+2;<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        else{<o:p></o:p></p>
<p class="MsoNormal">            dsp[row+1]=dsp[row]+3;<o:p></o:p></p>
<p class="MsoNormal">            col[2+(row-1)*3+0]=row-1;<o:p></o:p></p>
<p class="MsoNormal">            col[2+(row-1)*3+1]=row;<o:p></o:p></p>
<p class="MsoNormal">            col[2+(row-1)*3+2]=row+1;<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">double check_res(std::vector<int>& dsp,std::vector<int>& col,std::vector<double>& val ,std::vector<double>& sol,std::vector<double> rhs){<o:p></o:p></p>
<p class="MsoNormal">    int n_rows=dsp.size()-1;<o:p></o:p></p>
<p class="MsoNormal">    double res=0;<o:p></o:p></p>
<p class="MsoNormal">    for (int row=0;row<n_rows;row++){<o:p></o:p></p>
<p class="MsoNormal">        for(int entry=dsp[row];entry<dsp[row+1];entry++){<o:p></o:p></p>
<p class="MsoNormal">            int c=col[entry];<o:p></o:p></p>
<p class="MsoNormal">            rhs[row]-=val[entry]*sol[c];<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        res+=rhs[row]*rhs[row];<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    return sqrt(res);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">int main(int argc, char **argv) {<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    int n_rows = 20;<o:p></o:p></p>
<p class="MsoNormal">    std::vector<double> rhs(n_rows);<o:p></o:p></p>
<p class="MsoNormal">    std::vector<double> sol(n_rows);<o:p></o:p></p>
<p class="MsoNormal">    std::vector<int> dsp; <o:p></o:p></p>
<p class="MsoNormal">    std::vector<int> cols;<o:p></o:p></p>
<p class="MsoNormal">    std::vector<double> vals;<o:p></o:p></p>
<p class="MsoNormal">    set_crs_structure(n_rows,dsp,cols,vals);<o:p></o:p></p>
<p class="MsoNormal">    PetscInitializeNoArguments(); <o:p></o:p></p>
<p class="MsoNormal">    petsc_solver p;<o:p></o:p></p>
<p class="MsoNormal">    p.set_matrix(dsp,cols,vals);<o:p></o:p></p>
<p class="MsoNormal">    p.set_rhs(rhs);<o:p></o:p></p>
<p class="MsoNormal">    p.set_sol(sol);<o:p></o:p></p>
<p class="MsoNormal">    for (int i=0;i<100;i++){<o:p></o:p></p>
<p class="MsoNormal">        change_rhs(i,n_rows,rhs);<o:p></o:p></p>
<p class="MsoNormal">        change_matrix(i,n_rows,vals);<o:p></o:p></p>
<p class="MsoNormal">        // std::cout<<"RES BEFORE:"<<check_res(dsp,cols,vals,sol,rhs)<<"\n";<o:p></o:p></p>
<p class="MsoNormal">        int iter = p.solve(false);<o:p></o:p></p>
<p class="MsoNormal">        std::cout<<"SOL:"<<i<<" ITERS:"<<iter<<" RES:"<<check_res(dsp,cols,vals,sol,rhs)<<"\n";<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal">    PetscFinalize();<o:p></o:p></p>
<p class="MsoNormal">    return -1;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal">//##########################################################################################<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">This is a full working minimal example <o:p></o:p></p>
<p class="MsoNormal">When I callgrind this, it shows me that the vecduplicate is called as often as the solve process itself,<o:p></o:p></p>
<p class="MsoNormal">I hope this clarifies my issue,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Best regards,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Franz<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b>From:</b> Stefano Zampini <stefano.zampini@gmail.com> <br>
<b>Sent:</b> Tuesday, June 6, 2023 4:40 PM<br>
<b>To:</b> Pichler, Franz <franz.pichler@v2c2.at><br>
<b>Cc:</b> petsc-users@mcs.anl.gov<br>
<b>Subject:</b> Re: [petsc-users] Petsc using VecDuplicate in solution process<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Il giorno mar 6 giu 2023 alle ore 09:24 Pichler, Franz <<a href="mailto:franz.pichler@v2c2.at">franz.pichler@v2c2.at</a>> ha scritto:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hello,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I was just investigating my KSP_Solve_BCGS Routine with algrandcallgrind,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I see there that petsc is using a vecduplicate (onvolvin malloc and copy) every time it is called.<o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Do you mean <span style="font-size:16.0pt;font-family:"Menlo",serif;color:black">KSPSolve_BCGS?</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">There's only one VecDuplicate in there and it is called only once. An example code showing the problem would help<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I call it several thousand times (time evolution problem with rather small matrices)<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I am not quite sure which vector is copied there but I guess is the initial guess or the rhs,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Is there a tool in petsc to avoid any vecduplication by providing a fixed memory for this vector?<br>
<br>
Some corner facts of my routine:<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I assemble the matrices(crs,serial) and vectors myself and then use<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">MatCreateSeqAIJWithArrays and VecCreateSeqWithArray<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">To wrap petsc around it,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I use a ILU preconditioner and the sparsity patterns between the calls to not change, the values do,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thank you for any hint how to avoid the vecduplicate,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Best regards<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Franz<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:black">Dr. Franz Pichler</span></b><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Lead Researcher Area E</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:10.0pt;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span style="font-size:10.0pt;color:black">Virtual Vehicle Research GmbH</span></b><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:3.0pt"><b><span style="font-size:10.0pt;color:black"> </span></b><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:2.0pt;line-height:115%">
<span lang="IT" style="font-size:10.0pt;line-height:115%;color:black">Inffeldgasse 21a, 8010 Graz, Austria</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:115%">
<span lang="FR" style="font-size:10.0pt;line-height:115%;color:black">Phone: +43 316 873 9818
</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:2.0pt"><span lang="FR" style="font-size:10.0pt;color:black"><a href="mailto:franz.pichler@v2c2.at" target="_blank">franz.pichler@v2c2.at</a></span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:115%">
<span lang="DE-AT" style="font-size:12.0pt;line-height:115%;font-family:"Times New Roman",serif;color:black"><a href="http://www.v2c2.at/" target="_blank"><span lang="FR" style="font-size:10.0pt;line-height:115%;font-family:"Calibri",sans-serif">www.v2c2.at</span></a></span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="FR" style="color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Firmenname: Virtual Vehicle Research GmbH </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Rechtsform: Gesellschaft mit beschränkter Haftung </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Firmensitz: Austria, 8010 Graz, Inffeldgasse 21/A </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Firmenbuchnummer: 224755y </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">Firmenbuchgericht: Landesgericht für ZRS Graz </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black">UID: ATU54713500 </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE" style="font-size:8.0pt;font-family:"Arial",sans-serif;color:black"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="DE"> </span><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><span class="gmailsignatureprefix">-- </span><o:p></o:p></p>
<div>
<p class="MsoNormal">Stefano<o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>