<div dir="ltr">Barry,<div><br></div><div>Thanks. I think I understood.</div><div><br></div><div>Cong Li</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 6, 2015 at 3:01 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Aug 5, 2015, at 4:47 AM, Cong Li <<a href="mailto:solvercorleone@gmail.com">solvercorleone@gmail.com</a>> wrote:<br>
><br>
>> Hi,<br>
>><br>
>> I am wondering if it is necessary to call<br>
>> MatAssemblyBegin() and MatAssemblyEnd() after MatDuplicate() with the option of MAT_DO_NOT_COPY_VALUES.<br>
>> For example, if I have an assembled matrix A, and I call MatDuplicate() to create B, which is a duplication of A.<br>
>> Do I need to call MatAssemblyBegin() and MatAssemblyEnd() for B.<br>
<br>
</span>  You should not need to. But note if you use the flag MAT_DO_NOT_COPY_VALUES the new matrix will have zero for all the numerical entries.<br>
<span class="">><br>
>><br>
>> And 2nd question is :<br>
>> just after the MatCreateDense() call and before MatAssemblyBegin() and MatAssemblyEnd() calls, can I use MatGetArray() ?<br>
<br>
</span>   Dense matrices are a special case because room is always allocated for all the matrix entries and one can use MatDenseGetArray() to either access or set any local value. So if you are only setting/accessing local values you don't actually need to use MatSetValues() (though you can) you can just access the locations directly after using MatDenseGetArray().  There is no harm in calling the MatAssemblyBegin/End() "extra" times for dense matrices.<br>
<div class="HOEnZb"><div class="h5"><br>
>><br>
>> The 3rd question is:<br>
>> before the MatAssemblyBegin() and MatAssemblyEnd() calls, should I use INSERT_VALUES or ADD_VALUES for MatSetValues call? And why ?<br>
>> Actually I have read the manual, but I still feel confused about the means of INSERT_VALUES and ADD_VALUES.<br>
> There are a couple of reasons that you need to make these MatAssemblyBegin/End calls:<br>
> - entries can be set which should be stored on a different process, so these need to be communicated<br>
> - for compressed formats like CSR (as used in MATAIJ and others) the entries need to be processed into their compressed form<br>
> In general, the entries of the matrix are not stored in their "usable" forms until you make the MatAssembleEnd call. Rather they are kept in some easy-to-insert-into intermediate storage. INSERT_VALUES means that old values that might be in the matrix are overwritten , and ADD_VALUES means that the new entries from intermediate storage are added to the old values.<br>
><br>
><br>
>><br>
>> Thanks<br>
>><br>
>> Cong Li<br>
><br>
<br>
</div></div></blockquote></div><br></div>