<div><br></div><div><br><div class="gmail_quote"><div dir="ltr">On Mon, 27 Aug 2018 at 10:12, Ali Reza Khaz'ali <<a href="mailto:arkhazali@cc.iut.ac.ir">arkhazali@cc.iut.ac.ir</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> > Okay, interesting.  I take it you either are not running in parallel <br>
or need to have several subdomains (of varying size) per process.<br>
 > One approach would be to use PCASM (with zero overlap, it is <br>
equivalent to Block Jacobi) and then use -mat_partitioning_type to <br>
select a partitioner (could be a general graph partitioner or could by a <br>
custom implementation that you provide).  I don't know if this would <br>
feel overly clumsy or ultimately be a cleaner and more generic approach.<br>
<br>
Thanks for the answer. I'm still running a serial code. I plan to <br>
parallelized it after finding a suitable solver. Unfortunately, I do not <br>
know how to use PCASM, and therefore, I'm going to learn it. In <br>
addition, I found another possible solution with MATNEST. However, I do <br>
not know if MATNEST is suitable for my application or if it can be used <br>
with SNES. I'd be grateful if you could kindly guide me about it.<br>
<br>
<br>
<br>
 > Lets discuss this point a bit further. I assume your system is <br>
sparse. Sparse direct solvers can solve systems fairly efficiently for <br>
hundreds of thousands of unknowns. How big do you want? Also, do you <br>
plan on having more than 500K unknowns per process? If not, why not just <br>
use sparse direct solvers on each process?<br>
<br>
Thanks for the answer. My system is sparse, and also a variable sized <br>
block matrix. For example, for a small size simulation, I have about 7K <br>
unknowns. For ONE TIME STEP, Intel MKL PARDISO took about 30 minutes to <br>
solve my system, while occupying about 2.5GB out of my 4GB RAM. Since I <br>
have to simulate at least 10000 time steps, the runtime (and the <br>
required RAM) would be unacceptable.<br>
<br>
<br>
<br>
 > If none of the suggestions provided is to your taste, why not just <br>
build the preconditioner matrix yourself? Seems your have precise <br>
requirements and the relevant info of the individual blocks, so you <br>
should be able to construct the preconditioner, either using A (original <br>
operator) or directly from the discrete problem.<br>
<br>
Thanks for your answer. As I stated, I have built a preconditioner for <br>
it. </blockquote><div dir="auto"><br></div><div dir="auto">I mean directly build the preconditioner with the required block diagonal structure. Then do don't need to use something like PCBJACOBI or PCASM to extract the block diagonal operator from your original operator.</div><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">My preconditioner does not require a large memory, however, it has a <br>
low performance (even on GPU). Therefore, I'm trying to use PETSc <br>
functions and modules to solve the system more efficiently. I do not <br>
think there is any other library more suited than PETSc for the job.<br>
<br>
<br>
<br>
Best Regards,<br>
Ali<br>
</blockquote></div></div>