<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div>   Roland,<div class=""><br class=""></div><div class="">     You would need an algorithm to decide which entries of the vector you wish to use and then make sure those entries end up on the appropriate MPI process before the matrix vector product. You would use VecScatterCreate() and VecScatterBegin/End to move the vector entries to the correct location. See the manual page for MatCreateMPIAIJ() or the users manual for a discussion of the "right" vector used in matrix-vector products.</div><div class=""> </div><div class="">     For example,</div><div class=""><br class=""></div><div class="">             Say  v has 2 extra entries than the number of rows of A. </div><div class=""><br class=""></div><div class="">                 Vec right;</div><div class="">                 IS   is;</div><div class="">                 MatCreateVecs(A,&right,NULL);</div><div class="">                 // right will be used to store the truncated v vector</div><div class="">                 VecScatterCreate(PETSC_COMM_WORLD,v,is,right,NULL,&scatter);</div><div class="">                 VecScatterBegin(scatter,v,right,INSERT_VALUES,{SCATTER_FORWARD);<br class=""><div>                 VecScatterEnd(scatter,v,right,INSERT_VALUES,{SCATTER_FORWARD);</div><div>                 MatDiagonalScale(A,NULL,right);</div><div><br class=""></div><div>            The "is" above that you need provide determines which entries of v you keep (or you could say which entries you do not keep).  In say a trivial case on one process , if v has 12 entries and you just want to keep the first 10 then you would use ISCreateStride(PETSC_COMM_SELF,10,0,1,&is); If you want to drop specific entries "in the middle" of the v then you would use ISCreateGeneral() to list the entries you wish to keep.  </div><div><br class=""></div><div>    In parallel things are slightly trickier because each process needs to list in its part of  "is" the entries needed for its part of the right of the right vector.  So say v = [ w u ; q r]  where w, u, q, r are numbers and ; indicates the split between the first and second MPI rank and right has entries [w ; q r] then is on the first rank needs to have one entry (0) to grab the w and is on the second rank needs two entries (2,3) to grab the q and r. (Note the is entries are in global numbering across all the ranks).</div><div><br class=""></div><div>  Barry</div><div><br class=""></div><div><br class=""></div><div>       </div><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 8, 2020, at 4:16 PM, Roland Richter <<a href="mailto:roland.richter@ntnu.no" class="">roland.richter@ntnu.no</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
  
  <div class=""><p class="">Yes, that would be exactly what I need, I have not thought about
      that possibility, thanks!</p><p class="">Concerning slicing: Assumed my matrix A and vector v are defined
      by</p><p class="">A = |a b|<br class="">
             |c d|<br class="">
      v = |w x y z|</p><p class="">After v is larger than the row size of A, I only can take some
      elements for multiplication and therefore I have to use only a
      slice of vector v:</p><p class="">A*v[1:2] =  |xa yb|<br class="">
                          |xc yd|</p><p class="">or</p><p class="">A*v[0:1] =    |wa xb|<br class="">
                            |wc xd|</p><p class="">How could I do that?</p><p class="">Thanks,</p><p class="">Roland<br class="">
    </p><p class=""><br class="">
    </p>
    <div class="moz-cite-prefix">Am 08.12.2020 um 19:26 schrieb Matthew
      Knepley:<br class="">
    </div>
    <blockquote type="cite" cite="mid:CAMYG4G=bQtqDqTsj3+RtOMgmSURqbcJ=Any5TFmraMR6GwHcvA@mail.gmail.com" class="">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
      <div dir="ltr" class="">
        <div dir="ltr" class="">On Tue, Dec 8, 2020 at 1:13 PM Roland Richter
          <<a href="mailto:roland.richter@ntnu.no" moz-do-not-send="true" class="">roland.richter@ntnu.no</a>> wrote:<br class="">
        </div>
        <div class="gmail_quote">
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
            0.8ex;border-left:1px solid
            rgb(204,204,204);padding-left:1ex">Hei,<br class="">
            <br class="">
            I would like to multiply a row-vector to each row in a dense
            matrix,<br class="">
            either full or sliced (i.e. if the row-vector is larger than
            the row<br class="">
            length of the matrix). Armadillo offers a
            each_row()-function, where I<br class="">
            can iterate over all rows in a matrix and multiply the
            vector to them<br class="">
            (similar to the operation VecPointwiseMult()). Is there a
            similar<br class="">
            operation in PETSc? Ideally with the option of only
            multiplying a<br class="">
            part/slice of the row vector to each row, if the
            corresponding row of<br class="">
            the target matrix is shorter than the initial row vector.<br class="">
          </blockquote>
          <div class=""><br class="">
          </div>
          <div class="">It helps to write in linear algebra notation so that we
            can be sure we are talking</div>
          <div class="">about the same thing. Say we have the matrix A and vector
            v</div>
          <div class=""><br class="">
          </div>
          <div class="">  A = / a b \  v = <m, n></div>
          <div class="">        \ c d /</div>
          <div class=""><br class="">
          </div>
          <div class="">and you want</div>
          <div class=""><br class="">
          </div>
          <div class="">  A * m = / ma nb \ = / a b \ / m 0 \ = A . diag(v)</div>
          <div class="">               \ mc nd /    \ c d /  \ 0  n /</div>
          <div class=""><br class="">
          </div>
          <div class="">which you can get using <a href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatDiagonalScale.html" moz-do-not-send="true" class="">https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatDiagonalScale.html</a></div>
          <div class=""><br class="">
          </div>
          <div class="">is that what you want? I do not have a clear picture of
            what you want slicing for.</div>
          <div class=""><br class="">
          </div>
          <div class="">  Thanks,</div>
          <div class=""><br class="">
          </div>
          <div class="">     Matt</div>
          <div class=""> </div>
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
            0.8ex;border-left:1px solid
            rgb(204,204,204);padding-left:1ex">
            Thanks,<br class="">
            <br class="">
            Roland<br class="">
            <br class="">
          </blockquote>
        </div>
        <br clear="all" class="">
        <div class=""><br class="">
        </div>
        -- <br class="">
        <div dir="ltr" class="gmail_signature">
          <div dir="ltr" class="">
            <div class="">
              <div dir="ltr" class="">
                <div class="">
                  <div dir="ltr" class="">
                    <div class="">What most experimenters take for granted before
                      they begin their experiments is infinitely more
                      interesting than any results to which their
                      experiments lead.<br class="">
                      -- Norbert Wiener</div>
                    <div class=""><br class="">
                    </div>
                    <div class=""><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank" moz-do-not-send="true" class="">https://www.cse.buffalo.edu/~knepley/</a><br class="">
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
  </div>

</div></blockquote></div><br class=""></div></body></html>