/***************************************************************************** Copyright (c) 2011-2016, The OpenBLAS Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the OpenBLAS project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **********************************************************************************/ #include "openblas_utest.h" /* void BLASFUNC(cpotrf)(char*, BLASINT*, complex float*, BLASINT*, BLASINT*); void BLASFUNC(zpotrs_(char*, BLASINT*, BLASINT*, complex double*, BLASINT*, complex double*, BLASINT*, BLASINT*); */ //https://github.com/xianyi/OpenBLAS/issues/695 CTEST(potrf, bug_695){ openblas_complex_float A1[100] = { openblas_make_complex_float(5.8525753, +0.0), openblas_make_complex_float(-0.79540455, -0.7066077), openblas_make_complex_float(0.98274714, -1.3824869), openblas_make_complex_float(2.619998, -1.8532984), openblas_make_complex_float(-1.8306153, +1.2336911), openblas_make_complex_float(0.32275113, -0.015575029), openblas_make_complex_float(2.1968813, -1.0640624), openblas_make_complex_float(0.27894387, -0.97911835), openblas_make_complex_float(3.0476584, -0.18548489), openblas_make_complex_float(0.3842994, -0.7050991), openblas_make_complex_float(-0.79540455, +0.7066077), openblas_make_complex_float(8.313246, +0.0), openblas_make_complex_float(-1.8076122, +0.8882447), openblas_make_complex_float(0.47806996, -0.48494184), openblas_make_complex_float(0.5096429, +0.5395974), openblas_make_complex_float(-0.7285097, +0.10360408), openblas_make_complex_float(-1.1760061, +2.7146957), openblas_make_complex_float(-0.4271084, -0.042899966), openblas_make_complex_float(-1.7228563, -2.8335886), openblas_make_complex_float(1.8942566, -0.6389735), openblas_make_complex_float(0.98274714, +1.3824869), openblas_make_complex_float(-1.8076122, -0.8882447), openblas_make_complex_float(9.367975, +0.0), openblas_make_complex_float(-0.1838578, -0.6468568), openblas_make_complex_float(-1.8338387, -0.7064959), openblas_make_complex_float(0.041852742, +0.6556877), openblas_make_complex_float(2.5673025, -1.9732997), openblas_make_complex_float(-1.1148382, +0.15693812), openblas_make_complex_float(2.4704504, +1.0389464), openblas_make_complex_float(1.0858271, +1.298006), openblas_make_complex_float(2.619998, +1.8532984), openblas_make_complex_float(0.47806996, +0.48494184), openblas_make_complex_float(-0.1838578, +0.6468568), openblas_make_complex_float(3.1117508, +0.0), openblas_make_complex_float(-1.956626, -0.22825956), openblas_make_complex_float(0.07081801, +0.31801307), openblas_make_complex_float(0.3698375, +0.5400855), openblas_make_complex_float(0.80686307, -1.5315914), openblas_make_complex_float(1.5649154, +1.6229297), openblas_make_complex_float(-0.112077385, -1.2014246), openblas_make_complex_float(-1.8306153, -1.2336911), openblas_make_complex_float(0.5096429, -0.5395974), openblas_make_complex_float(-1.8338387, +0.7064959), openblas_make_complex_float(-1.956626, +0.22825956), openblas_make_complex_float(3.6439795, +0.0), openblas_make_complex_float(-0.2594722, -0.48786148), openblas_make_complex_float(-0.47636223, +0.27821827), openblas_make_complex_float(-0.61608654, +2.01858), openblas_make_complex_float(-2.7767487, -1.7693765), openblas_make_complex_float(0.048102796, +0.9741874), openblas_make_complex_float(0.32275113, +0.015575029), openblas_make_complex_float(-0.7285097, -0.10360408), openblas_make_complex_float(0.041852742, -0.6556877), openblas_make_complex_float(0.07081801, -0.31801307), openblas_make_complex_float(-0.2594722, +0.48786148), openblas_make_complex_float(3.624376, +0.0), openblas_make_complex_float(-1.6697118, -0.4017511), openblas_make_complex_float(-1.4397877, +0.7550918), openblas_make_complex_float(-0.31456697, +1.0403451), openblas_make_complex_float(-0.31978557, -0.13701046), openblas_make_complex_float(2.1968813, +1.0640624), openblas_make_complex_float(-1.1760061, -2.7146957), openblas_make_complex_float(2.5673025, +1.9732997), openblas_make_complex_float(0.3698375, -0.5400855), openblas_make_complex_float(-0.47636223, -0.27821827), openblas_make_complex_float(-1.6697118, +0.4017511), openblas_make_complex_float(6.8273163, +0.0), openblas_make_complex_float(-0.10051322, -0.24303961), openblas_make_complex_float(1.4415971, -0.29750675), openblas_make_complex_float(1.221786, +0.85654986), openblas_make_complex_float(0.27894387, +0.97911835), openblas_make_complex_float(-0.4271084, +0.042899966), openblas_make_complex_float(-1.1148382, -0.15693812), openblas_make_complex_float(0.80686307, +1.5315914), openblas_make_complex_float(-0.61608654, -2.01858), openblas_make_complex_float(-1.4397877, -0.7550918), openblas_make_complex_float(-0.10051322, +0.24303961), openblas_make_complex_float(3.4057708, +0.0), openblas_make_complex_float(-0.5856801, +1.0203559), openblas_make_complex_float(0.7103452, -0.8422135), openblas_make_complex_float(3.0476584, +0.18548489), openblas_make_complex_float(-1.7228563, +2.8335886), openblas_make_complex_float(2.4704504, -1.0389464), openblas_make_complex_float(1.5649154, -1.6229297), openblas_make_complex_float(-2.7767487, +1.7693765), openblas_make_complex_float(-0.31456697, -1.0403451), openblas_make_complex_float(1.4415971, +0.29750675), openblas_make_complex_float(-0.5856801, -1.0203559), openblas_make_complex_float(7.005772, +0.0), openblas_make_complex_float(-0.9617417, +1.2486815), openblas_make_complex_float(0.3842994, +0.7050991), openblas_make_complex_float(1.8942566, +0.6389735), openblas_make_complex_float(1.0858271, -1.298006), openblas_make_complex_float(-0.112077385, +1.2014246), openblas_make_complex_float(0.048102796, -0.9741874), openblas_make_complex_float(-0.31978557, +0.13701046), openblas_make_complex_float(1.221786, -0.85654986), openblas_make_complex_float(0.7103452, +0.8422135), openblas_make_complex_float(-0.9617417, -1.2486815), openblas_make_complex_float(3.4629636, +0.0) }; char up = 'U'; blasint n=10; blasint info[1]; BLASFUNC(cpotrf)(&up, &n, (float*)(A1), &n, info); //printf("%g+%g*I\n", creal(A1[91]), cimag(A1[91])); openblas_complex_double A2[100] = { openblas_make_complex_double(3.0607147216796875, +0.0), openblas_make_complex_double(-0.5905849933624268, -0.29020825028419495), openblas_make_complex_double(0.321084201335907, +0.45168760418891907), openblas_make_complex_double(0.8387917876243591, -0.644718587398529), openblas_make_complex_double(-0.3642411530017853, +0.051274992525577545), openblas_make_complex_double(0.8071482181549072, +0.33944568037986755), openblas_make_complex_double(0.013674172572791576, +0.21422699093818665), openblas_make_complex_double(0.35476258397102356, +0.42408594489097595), openblas_make_complex_double(-0.5991537570953369, -0.23082709312438965), openblas_make_complex_double(-0.0600702166557312, -0.2113417387008667), openblas_make_complex_double(-0.7954045534133911, +0.7066076993942261), openblas_make_complex_double(2.807175397872925, +0.0), openblas_make_complex_double(-0.1691000759601593, +0.313548743724823), openblas_make_complex_double(-0.30911174416542053, +0.7447023987770081), openblas_make_complex_double(-0.22347848117351532, +0.03316075727343559), openblas_make_complex_double(-0.4088296890258789, -1.0214389562606812), openblas_make_complex_double(-0.2344931811094284, +0.08056317269802094), openblas_make_complex_double(0.793269693851471, -0.17507623136043549), openblas_make_complex_double(0.03163455054163933, +0.20559945702552795), openblas_make_complex_double(0.13581633567810059, -0.2110036462545395), openblas_make_complex_double(0.9827471375465393, +1.3824869394302368), openblas_make_complex_double(-1.8076121807098389, -0.8882446885108948), openblas_make_complex_double(2.3277781009674072, +0.0), openblas_make_complex_double(0.830405056476593, -0.19296252727508545), openblas_make_complex_double(0.1394239068031311, -0.5260677933692932), openblas_make_complex_double(1.239942193031311, -0.09915469586849213), openblas_make_complex_double(0.06731037050485611, -0.059320636093616486), openblas_make_complex_double(0.11507681757211685, -0.1984301060438156), openblas_make_complex_double(-0.6843825578689575, +0.4647614359855652), openblas_make_complex_double(1.213119387626648, -0.7757048010826111), openblas_make_complex_double(2.619997978210449, +1.8532984256744385), openblas_make_complex_double(0.4780699610710144, +0.48494184017181396), openblas_make_complex_double(-0.18385779857635498, +0.6468567848205566), openblas_make_complex_double(2.0811400413513184, +0.0), openblas_make_complex_double(-0.035075582563877106, +0.09732913225889206), openblas_make_complex_double(0.27337002754211426, -0.9032229781150818), openblas_make_complex_double(-0.8374675512313843, +0.0479498989880085), openblas_make_complex_double(0.6916252374649048, +0.45711082220077515), openblas_make_complex_double(0.1883818507194519, +0.06482727080583572), openblas_make_complex_double(-0.32384994626045227, +0.05857187137007713), openblas_make_complex_double(-1.8306152820587158, -1.2336910963058472), openblas_make_complex_double(0.5096428990364075, -0.5395973920822144), openblas_make_complex_double(-1.833838701248169, +0.7064958810806274), openblas_make_complex_double(-1.956626057624817, +0.22825956344604492), openblas_make_complex_double(1.706615924835205, +0.0), openblas_make_complex_double(-0.2895336151123047, +0.17579378187656403), openblas_make_complex_double(-0.923172116279602, -0.4530014097690582), openblas_make_complex_double(0.5040621757507324, -0.37026339769363403), openblas_make_complex_double(-0.2824432849884033, -1.0374568700790405), openblas_make_complex_double(0.1399831622838974, +0.4977008104324341), openblas_make_complex_double(0.32275113463401794, +0.015575028955936432), openblas_make_complex_double(-0.7285097241401672, -0.10360407829284668), openblas_make_complex_double(0.041852742433547974, -0.655687689781189), openblas_make_complex_double(0.07081800699234009, -0.318013072013855), openblas_make_complex_double(-0.25947219133377075, +0.4878614842891693), openblas_make_complex_double(1.5735365152359009, +0.0), openblas_make_complex_double(-0.2647853195667267, -0.26654252409935), openblas_make_complex_double(-0.6190430521965027, -0.24699924886226654), openblas_make_complex_double(-0.6288471221923828, +0.48154571652412415), openblas_make_complex_double(0.02446540631353855, -0.2611822783946991), openblas_make_complex_double(2.1968812942504883, +1.0640623569488525), openblas_make_complex_double(-1.1760060787200928, -2.714695692062378), openblas_make_complex_double(2.5673024654388428, +1.9732997417449951), openblas_make_complex_double(0.3698374927043915, -0.54008549451828), openblas_make_complex_double(-0.4763622283935547, -0.27821826934814453), openblas_make_complex_double(-1.6697118282318115, +0.4017511010169983), openblas_make_complex_double(1.2674795389175415, +0.0), openblas_make_complex_double(0.3079095482826233, -0.07258892804384232), openblas_make_complex_double(-0.5929520130157471, -0.038360968232154846), openblas_make_complex_double(0.04388086497783661, -0.025549031794071198), openblas_make_complex_double(0.27894386649131775, +0.9791183471679688), openblas_make_complex_double(-0.42710840702056885, +0.0428999662399292), openblas_make_complex_double(-1.1148382425308228, -0.1569381207227707), openblas_make_complex_double(0.8068630695343018, +1.5315914154052734), openblas_make_complex_double(-0.6160865426063538, -2.0185799598693848), openblas_make_complex_double(-1.439787745475769, -0.7550917863845825), openblas_make_complex_double(-0.10051321983337402, +0.24303960800170898), openblas_make_complex_double(0.9066106081008911, +0.0), openblas_make_complex_double(0.05315789580345154, -0.06136537343263626), openblas_make_complex_double(-0.21304509043693542, +0.6494344472885132), openblas_make_complex_double(3.0476584434509277, +0.1854848861694336), openblas_make_complex_double(-1.7228562831878662, +2.8335886001586914), openblas_make_complex_double(2.4704504013061523, -1.0389463901519775), openblas_make_complex_double(1.564915418624878, -1.6229296922683716), openblas_make_complex_double(-2.7767486572265625, +1.769376516342163), openblas_make_complex_double(-0.314566969871521, -1.0403450727462769), openblas_make_complex_double(1.4415971040725708, +0.29750674962997437), openblas_make_complex_double(-0.5856801271438599, -1.0203559398651123), openblas_make_complex_double(0.5668219923973083, +0.0), openblas_make_complex_double(0.033351436257362366, -0.07832501083612442), openblas_make_complex_double(0.3842993974685669, +0.7050991058349609), openblas_make_complex_double(1.894256591796875, +0.6389734745025635), openblas_make_complex_double(1.085827112197876, -1.2980060577392578), openblas_make_complex_double(-0.11207738518714905, +1.2014245986938477), openblas_make_complex_double(0.04810279607772827, -0.9741873741149902), openblas_make_complex_double(-0.31978556513786316, +0.13701045513153076), openblas_make_complex_double(1.2217860221862793, -0.856549859046936), openblas_make_complex_double(0.7103452086448669, +0.84221351146698), openblas_make_complex_double(-0.9617416858673096, -1.2486815452575684), openblas_make_complex_double(0.0756804421544075, +0.0) }; openblas_complex_double B[20] = { openblas_make_complex_double(-0.21782716937787788, -0.9222220085490986), openblas_make_complex_double(-0.7620356655676837, +0.15533508334193666), openblas_make_complex_double(-0.905011814118756, +0.2847570854574069), openblas_make_complex_double(-0.3451346708401685, +1.076948486041297), openblas_make_complex_double(0.25336108035924787, +0.975317836492159), openblas_make_complex_double(0.11192755545114, -0.1603741874112385), openblas_make_complex_double(-0.20604111555491242, +0.10570814584017311), openblas_make_complex_double(-1.0568488936791578, -0.06025820467086475), openblas_make_complex_double(-0.6650468984506477, -0.5000967284800251), openblas_make_complex_double(-1.0509472322215125, +0.5022165705328413), openblas_make_complex_double(-0.727775859267237, +0.50638268521728), openblas_make_complex_double(0.39947219167701153, -0.4576746001199889), openblas_make_complex_double(-0.7122162951294634, -0.630289556702497), openblas_make_complex_double(0.9870834574024372, -0.2825689605519449), openblas_make_complex_double(0.0628393808469436, -0.1253397353973715), openblas_make_complex_double(0.8439562576196216, +1.0850814110398734), openblas_make_complex_double(0.562377322638969, -0.2578030745663871), openblas_make_complex_double(0.12696236014017806, -0.09853584666755086), openblas_make_complex_double(-0.023682508769195098, +0.18093440285319276), openblas_make_complex_double(-0.7264975746431271, +0.31670415674097235) }; char lo = 'L'; blasint nrhs = 2; BLASFUNC(zpotrs)(&lo, &n, &nrhs, (double*)(A2), &n, (double*)(B), &n, info); // note that this is exactly equal to A1 openblas_complex_float A3[100] = { openblas_make_complex_float(5.8525753, +0.0), openblas_make_complex_float(-0.79540455, -0.7066077), openblas_make_complex_float(0.98274714, -1.3824869), openblas_make_complex_float(2.619998, -1.8532984), openblas_make_complex_float(-1.8306153, +1.2336911), openblas_make_complex_float(0.32275113, -0.015575029), openblas_make_complex_float(2.1968813, -1.0640624), openblas_make_complex_float(0.27894387, -0.97911835), openblas_make_complex_float(3.0476584, -0.18548489), openblas_make_complex_float(0.3842994, -0.7050991), openblas_make_complex_float(-0.79540455, +0.7066077), openblas_make_complex_float(8.313246, +0.0), openblas_make_complex_float(-1.8076122, +0.8882447), openblas_make_complex_float(0.47806996, -0.48494184), openblas_make_complex_float(0.5096429, +0.5395974), openblas_make_complex_float(-0.7285097, +0.10360408), openblas_make_complex_float(-1.1760061, +2.7146957), openblas_make_complex_float(-0.4271084, -0.042899966), openblas_make_complex_float(-1.7228563, -2.8335886), openblas_make_complex_float(1.8942566, -0.6389735), openblas_make_complex_float(0.98274714, +1.3824869), openblas_make_complex_float(-1.8076122, -0.8882447), openblas_make_complex_float(9.367975, +0.0), openblas_make_complex_float(-0.1838578, -0.6468568), openblas_make_complex_float(-1.8338387, -0.7064959), openblas_make_complex_float(0.041852742, +0.6556877), openblas_make_complex_float(2.5673025, -1.9732997), openblas_make_complex_float(-1.1148382, +0.15693812), openblas_make_complex_float(2.4704504, +1.0389464), openblas_make_complex_float(1.0858271, +1.298006), openblas_make_complex_float(2.619998, +1.8532984), openblas_make_complex_float(0.47806996, +0.48494184), openblas_make_complex_float(-0.1838578, +0.6468568), openblas_make_complex_float(3.1117508, +0.0), openblas_make_complex_float(-1.956626, -0.22825956), openblas_make_complex_float(0.07081801, +0.31801307), openblas_make_complex_float(0.3698375, +0.5400855), openblas_make_complex_float(0.80686307, -1.5315914), openblas_make_complex_float(1.5649154, +1.6229297), openblas_make_complex_float(-0.112077385, -1.2014246), openblas_make_complex_float(-1.8306153, -1.2336911), openblas_make_complex_float(0.5096429, -0.5395974), openblas_make_complex_float(-1.8338387, +0.7064959), openblas_make_complex_float(-1.956626, +0.22825956), openblas_make_complex_float(3.6439795, +0.0), openblas_make_complex_float(-0.2594722, -0.48786148), openblas_make_complex_float(-0.47636223, +0.27821827), openblas_make_complex_float(-0.61608654, +2.01858), openblas_make_complex_float(-2.7767487, -1.7693765), openblas_make_complex_float(0.048102796, +0.9741874), openblas_make_complex_float(0.32275113, +0.015575029), openblas_make_complex_float(-0.7285097, -0.10360408), openblas_make_complex_float(0.041852742, -0.6556877), openblas_make_complex_float(0.07081801, -0.31801307), openblas_make_complex_float(-0.2594722, +0.48786148), openblas_make_complex_float(3.624376, +0.0), openblas_make_complex_float(-1.6697118, -0.4017511), openblas_make_complex_float(-1.4397877, +0.7550918), openblas_make_complex_float(-0.31456697, +1.0403451), openblas_make_complex_float(-0.31978557, -0.13701046), openblas_make_complex_float(2.1968813, +1.0640624), openblas_make_complex_float(-1.1760061, -2.7146957), openblas_make_complex_float(2.5673025, +1.9732997), openblas_make_complex_float(0.3698375, -0.5400855), openblas_make_complex_float(-0.47636223, -0.27821827), openblas_make_complex_float(-1.6697118, +0.4017511), openblas_make_complex_float(6.8273163, +0.0), openblas_make_complex_float(-0.10051322, -0.24303961), openblas_make_complex_float(1.4415971, -0.29750675), openblas_make_complex_float(1.221786, +0.85654986), openblas_make_complex_float(0.27894387, +0.97911835), openblas_make_complex_float(-0.4271084, +0.042899966), openblas_make_complex_float(-1.1148382, -0.15693812), openblas_make_complex_float(0.80686307, +1.5315914), openblas_make_complex_float(-0.61608654, -2.01858), openblas_make_complex_float(-1.4397877, -0.7550918), openblas_make_complex_float(-0.10051322, +0.24303961), openblas_make_complex_float(3.4057708, +0.0), openblas_make_complex_float(-0.5856801, +1.0203559), openblas_make_complex_float(0.7103452, -0.8422135), openblas_make_complex_float(3.0476584, +0.18548489), openblas_make_complex_float(-1.7228563, +2.8335886), openblas_make_complex_float(2.4704504, -1.0389464), openblas_make_complex_float(1.5649154, -1.6229297), openblas_make_complex_float(-2.7767487, +1.7693765), openblas_make_complex_float(-0.31456697, -1.0403451), openblas_make_complex_float(1.4415971, +0.29750675), openblas_make_complex_float(-0.5856801, -1.0203559), openblas_make_complex_float(7.005772, +0.0), openblas_make_complex_float(-0.9617417, +1.2486815), openblas_make_complex_float(0.3842994, +0.7050991), openblas_make_complex_float(1.8942566, +0.6389735), openblas_make_complex_float(1.0858271, -1.298006), openblas_make_complex_float(-0.112077385, +1.2014246), openblas_make_complex_float(0.048102796, -0.9741874), openblas_make_complex_float(-0.31978557, +0.13701046), openblas_make_complex_float(1.221786, -0.85654986), openblas_make_complex_float(0.7103452, +0.8422135), openblas_make_complex_float(-0.9617417, -1.2486815), openblas_make_complex_float(3.4629636, +0.0) }; BLASFUNC(cpotrf)(&up, &n, (float*)(A3), &n, info); // printf("%g+%g*I\n", creal(A3[91]), cimag(A3[91])); if(isnan(CREAL(A3[91])) || isnan(CIMAG(A3[91]))) { CTEST_ERR("%s:%d got NaN", __FILE__, __LINE__); } } // Check potrf factorizes a small problem correctly CTEST(potrf, smoketest_trivial){ float A1s[4] = {2, 0.3, 0.3, 3}; double A1d[4] = {2, 0.3, 0.3, 3}; openblas_complex_float A1c[4] = { openblas_make_complex_float(2,0), openblas_make_complex_float(0.3,0.1), openblas_make_complex_float(0.3,-0.1), openblas_make_complex_float(3,0) }; openblas_complex_double A1z[4] = { openblas_make_complex_double(2,0), openblas_make_complex_double(0.3,0.1), openblas_make_complex_double(0.3,-0.1), openblas_make_complex_double(3,0) }; float zeros = 0, ones = 1; double zerod = 0, oned = 1; openblas_complex_float zeroc = openblas_make_complex_float(0, 0), onec = openblas_make_complex_float(1, 0); openblas_complex_double zeroz = openblas_make_complex_double(0, 0), onez = openblas_make_complex_float(1, 0); char uplo, trans1, trans2; blasint nv = 4; blasint n = 2; blasint inc = 1; blasint info = 0; int i, j, cycle; float As[4], Bs[4]; double Ad[4], Bd[4]; openblas_complex_float Ac[4], Bc[4]; openblas_complex_double Az[4], Bz[4]; for (cycle = 0; cycle < 2; ++cycle) { if (cycle == 0) { uplo = 'L'; } else { uplo = 'U'; } BLASFUNC(scopy)(&nv, A1s, &inc, As, &inc); BLASFUNC(dcopy)(&nv, A1d, &inc, Ad, &inc); BLASFUNC(ccopy)(&nv, (float *)A1c, &inc, (float *)Ac, &inc); BLASFUNC(zcopy)(&nv, (double *)A1z, &inc, (double *)Az, &inc); BLASFUNC(spotrf)(&uplo, &n, As, &n, &info); if (info != 0) { CTEST_ERR("%s:%d info != 0", __FILE__, __LINE__); } BLASFUNC(dpotrf)(&uplo, &n, Ad, &n, &info); if (info != 0) { CTEST_ERR("%s:%d info != 0", __FILE__, __LINE__); } BLASFUNC(cpotrf)(&uplo, &n, (float *)Ac, &n, &info); if (info != 0) { CTEST_ERR("%s:%d info != 0", __FILE__, __LINE__); } BLASFUNC(zpotrf)(&uplo, &n, (double *)Az, &n, &info); if (info != 0) { CTEST_ERR("%s:%d info != 0", __FILE__, __LINE__); } /* Fill the other triangle */ if (uplo == 'L') { for (i = 0; i < n; ++i) { for (j = i+1; j < n; ++j) { As[i+n*j] = 0; Ad[i+n*j] = 0; Ac[i+n*j] = zeroc; Az[i+n*j] = zeroz; } } } else { for (i = 0; i < n; ++i) { for (j = 0; j < i; ++j) { As[i+n*j] = 0; Ad[i+n*j] = 0; Ac[i+n*j] = zeroc; Az[i+n*j] = zeroz; } } } /* B = A A^H or A^H A */ if (uplo == 'L') { trans1 = 'N'; trans2 = 'C'; } else { trans1 = 'C'; trans2 = 'N'; } BLASFUNC(sgemm)(&trans1, &trans2, &n, &n, &n, &ones, As, &n, As, &n, &zeros, Bs, &n); BLASFUNC(dgemm)(&trans1, &trans2, &n, &n, &n, &oned, Ad, &n, Ad, &n, &zerod, Bd, &n); BLASFUNC(cgemm)(&trans1, &trans2, &n, &n, &n, (float *)&onec, (float *)Ac, &n, (float *)Ac, &n, (float *)&zeroc, (float *)Bc, &n); BLASFUNC(zgemm)(&trans1, &trans2, &n, &n, &n, (double *)&onez, (double *)Az, &n, (double *)Az, &n, (double *)&zeroz, (double *)Bz, &n); /* Check result is close to original */ for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { double err; err = fabs(A1s[i+n*j] - Bs[i+n*j]); if (err > 1e-5) { CTEST_ERR("%s:%d %c s(%d,%d) difference: %g", __FILE__, __LINE__, uplo, i, j, err); } err = fabs(A1d[i+n*j] - Bd[i+n*j]); if (err > 1e-12) { CTEST_ERR("%s:%d %c d(%d,%d) difference: %g", __FILE__, __LINE__, uplo, i, j, err); } #ifdef OPENBLAS_COMPLEX_C99 err = cabsf(A1c[i+n*j] - Bc[i+n*j]); #else err = hypot(A1c[i+n*j].real - Bc[i+n*j].real, A1c[i+n*j].imag - Bc[i+n*j].imag); #endif if (err > 1e-5) { CTEST_ERR("%s:%d %c c(%d,%d) difference: %g", __FILE__, __LINE__, uplo, i, j, err); } #ifdef OPENBLAS_COMPLEX_C99 err = cabs(A1z[i+n*j] - Bz[i+n*j]); #else err = hypot(A1z[i+n*j].real - Bz[i+n*j].real, A1z[i+n*j].imag - Bz[i+n*j].imag); #endif if (err > 1e-12) { CTEST_ERR("%s:%d %c z(%d,%d) difference: %g", __FILE__, __LINE__, uplo, i, j, err); } } } } }