public static JulianDate jauUt1utc(double ut11, double ut12, double dut1) throws JSOFAIllegalParameter, JSOFAInternalError

      {

          double utc1, utc2;
          boolean big1;
          int i;
          double duts, u1, u2, d1, dats1, d2, fd, dats2, ddats, us1, us2, du;


          /* UT1-UTC in seconds. */
          duts = dut1;

          /* Put the two parts of the UT1 into big-first order. */
          big1 = ( ut11 >= ut12 );
          if ( big1 ) {
              u1 = ut11;
              u2 = ut12;
          } else {
              u1 = ut12;
              u2 = ut11;
          }

          /* See if the UT1 can possibly be in a leap-second day. */
          d1 = u1;
          dats1 = 0;
          for ( i = -1; i <= 3; i++ ) {
              d2 = u2 + (double) i;
              Calendar dt = jauJd2cal(d1, d2 );
              dats2 = jauDat(dt.iy, dt.im, dt.id, 0.0);
              if ( i == - 1 ) dats1 = dats2;
              ddats = dats2 - dats1;
              if ( abs(ddats) >= 0.5 ) {

                  /* Yes, leap second nearby: ensure UT1-UTC is "before" value. */
                  if ( ddats * duts >= 0 ) duts -= ddats;

                  /* UT1 for the start of the UTC day that ends in a leap. */
                  JulianDate jd = jauCal2jd(dt.iy, dt.im, dt.id );
                  d1 = jd.djm0; d2 = jd.djm1;
                  us1 = d1;
                  us2 = d2 - 1.0 + duts/DAYSEC;

                  /* Is the UT1 after this point? */
                  du = u1 - us1;
                  du += u2 - us2;
                  if ( du > 0 ) {

                      /* Yes:  fraction of the current UTC day that has elapsed. */
                      fd = du * DAYSEC / ( DAYSEC + ddats );

                      /* Ramp UT1-UTC to bring about SOFA's JD(UTC) convention. */
                      duts += ddats * ( fd <= 1.0 ? fd : 1.0 );
                  }

                  /* Done. */
                  break;
              }
              dats1 = dats2;
          }

          /* Subtract the (possibly adjusted) UT1-UTC from UT1 to give UTC. */
          u2 -= duts / DAYSEC;

          /* Result, safeguarding precision. */
          if ( big1 ) {
              utc1 = u1;
              utc2 = u2;
          } else {
              utc1 = u2;
              utc2 = u1;
          }

          /* FIXME Status. */
          return new JulianDate(utc1, utc2);

      };