<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>