 		NewtonDone = false;
         Fac = 0.5; // ! Step reduction factor if too many iterations
         double NewtonIncrement = 0;
+#ifdef NEWTON_UNROLL
+		#pragma unroll NEWTON_UNROLL
+#endif
         for (NewtonIter = 0; NewtonIter < NewtonMaxit; NewtonIter++) {
         	//!~~~>   Prepare the loop-dependent part of the right-hand side
         	WADD(y, Z4, TMP);

            	Z4[i] += DZ4[i];
            }

            NewtonDone = (NewtonRate*NewtonIncrement <= NewtonTol);
            if (NewtonDone) break;
        }
        if (!NewtonDone) {
        	H = Fac*H;

            }

            NewtonDone = (NewtonRate * NewtonIncrement <= NewtonTol);
#ifndef NEWTON_UNROLL
            if (NewtonDone) break;
            if (NewtonIter == NewtonMaxit - 1) {
            	//todo implement return codes
				y[0] = logf(-1);
				return;
            }
#else //only break if it's at the end of the unroll
            if (NewtonDone && (NewtonIter + 1) % NewtonIter == 0) break;
            if ((NewtonIter + 1) % NewtonIter == 0 && NewtonIter == NewtonMaxit - 1) {
            	//todo implement return codes
				y[0] = logf(-1);
				return;
            }
#endif
		}
		if (!NewtonDone) {
			H = Fac * H;
